当前位置: 首页 > 知识库问答 >
问题:

在Java中生成范围内的非重复随机数

任繁
2023-03-14

我想生成1到4范围内的随机数,4包括。
以下是我的代码:

int num = r.nextInt(4) + 1;  //r is instance of Random.

然而,我在循环中运行上述代码,不希望重复随机数。现在发生的事情通常是:
1,1,1,2,3,1,4,2,2,1,4,2,4,4,4,2,1,4,3,3,1,4,2,4,1作为我的输出。

在这里,虽然数字在范围(1-4)内是随机的,但在前3次迭代中经常像数字“1”一样重复。

我正在寻找的是一种在循环中获得非重复随机数的方法。我知道的一个简单的方法是在当前迭代和比较之前保留最后一个随机数,但我相信一定有更好的解决方案。
提前谢谢。

共有3个答案

宦烈
2023-03-14

因为你有比你必须选择的更多的数字,你必须重复一些数字。你所能做的就是尽量减少立即重复的次数。

一种方法是使用Collections.shuffle,它允许你有一个随机的顺序,没有重复的数字,每次都这样做。你可以防止最后一个N值被重复。

要停止连续重复的数字,可以减小范围并使用模数。

int n = 0, max = 4;
Random rand = new Random();

for(int i = 0; i < numbers; i++) {
   n = (n + rand.nextInt(max-1)) % max;
   int numToUse = n + 1;
   // use this number.
}

这项工作实际上只有max-1可能的值,因为您不包括最后使用的值。

梁丘波鸿
2023-03-14

没有“更好”的答案。你得到的是一个随机数。检查这行:

1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1

这可能是完全随机的。所以我建议你描述一个更好的要求。您是否总是希望下一个号码与上一个号码不同?你想在特殊范围内最多复制一次吗?假设在6个连续的数字中,每个数字都允许出现两次?

如果你提出这样的要求,我们也许能帮助你。否则我们只能说:你看到的真的是随机的:)

贝钧
2023-03-14

使用random.nextInt(range-1),然后使用排除前一个数字的函数将该数字映射到输出数字:

public class Test {
  private final Random random = new Random();
  private final int range;
  private int previous;

  Test(int range) { this.range = range; }

  int nextRnd() {
    if (previous == 0) return previous = random.nextInt(range) + 1;
    final int rnd = random.nextInt(range-1) + 1;
    return previous = (rnd < previous? rnd : rnd + 1);
  }


  public static void main(String[] args) {
    final Test t = new Test(4);
    for (int i = 0; i < 100; i++) System.out.println(t.nextRnd());
  }
}
 类似资料:
  • 我目前正在创建一个应用程序,它将生成随机数。所以每次它都会生成三个数字num1、num2和num3。这些数字不应该重复。例如,如果num1=1,则num2和num3不能等于1。我尝试过此代码,它将显示0-2之间的三个不同数字。然而,我想生成1-3、2-4、3-5等范围内的随机数。因此,我如何通过使用下面的代码来实现这一点。请帮帮我,因为我是新手。非常感谢。

  • 本文向大家介绍C#生成指定范围内的不重复随机数,包括了C#生成指定范围内的不重复随机数的使用技巧和注意事项,需要的朋友参考一下 C#生成指定范围内的不重复随机数 下面来介绍下其他网友的实现方法: 方法1:思想是用一个数组来保存索引号,先随机生成一个数组位置,然后把随机抽取到的位置的索引号取出来,并把最后一个索引号复制到当前的数组位置,然后使随机数的上限减一,具体如:先把这100个数放在一个数组内,

  • 问题内容: 我想创建一组随机数,在Java中没有重复项。 例如,我有一个数组来存储10,000个从0到9999的随机整数。 这是我到目前为止的内容: 但是上面的代码创建重复项。如何确保随机数不重复? 问题答案: 例如:

  • 本文向大家介绍Java 生成给定范围内的随机数,包括了Java 生成给定范围内的随机数的使用技巧和注意事项,需要的朋友参考一下 为了生成给定范围内的随机数,Java代码如下- 示例 输出结果 名为Demo的类包含主要功能。在这里,将创建一个新的随机实例以及一个新的数组列表。创建随机元素并将其分配给变量。使用add函数将这些随机变量添加到列表中。这些元素显示在控制台上。

  • 问题内容: 我看过很多文章,解释了这个问题,但是他们都使用整数值,老实说,我并没有完全理解它,所以这个问题: 我正在尝试在Java中生成从(-1554900.101)到(52952058699.3098)范围的随机数,我想知道是否有人可以向我解释这一点,因为我真的很想理解它。 我的想法:这是正确的方法吗?1)生成一个在我指定范围内的随机整数2)将生成的数除以pi以得到float / double随

  • 问题内容: 我有两个如下的双打 使用随机生成器,我需要在min和max范围之间创建一个双精度值。 但是这里没有什么可以指定范围的。 问题答案: 在Java 7发行之前曾问过这个问题,但是现在,还有另一种使用Java 7(及更高版本)API的可能方式: 将返回介于最小值(包含)和最大值(不含)之间的伪随机双精度值。范围不一定是,可以是。