从0-9获得四个唯一随机数的最佳方法是什么?

Sag*_*tam 8 java random numbers

我想生成0到9范围内的四个随机数.使用Java Random类生成四个随机数很容易.

    Random random = new Random();

    int numbers[] = new int[4];

    for(int i=0;i<4;i++){

        numbers[i] = random.nextInt(10);

    }
Run Code Online (Sandbox Code Playgroud)

有了这个,我可以得到四个数字的易象,数组9369,4702等.在这种情况下,有可能在四个数字被重复了许多可能性,我不想在这样的数字重复.

在这里,我想所有的四位数以上阵列是唯一的,这样我可以输出像9543,1234等.

为此,我想到了以下方式.

  1. 生成随机数并指定为第一个数字.
  2. 生成一个随机数并检查第一个数字,如果不同的指定为第二个数字,则再次生成随机数并重复,依此类推.

有没有比上述方法更好的方法,以便我可以轻松快速地获得四个独特的随机数?

任何建议都表示赞赏.

Era*_*ran 32

你可以使用Collections.shuffle:

// generate a List that contains the numbers 0 to 9
List<Integer> digits = IntStream.range(0,10).boxed().collect(Collectors.toList());
// shuffle the List
Collections.shuffle (digits);
// take the first 4 elements of the List
int numbers[] = new int[4];
for(int i=0;i<4;i++){
    numbers[i] = digits.get(i);
}
Run Code Online (Sandbox Code Playgroud)

  • @lexicore不一定,因为这个答案有一个运行时`n`,其中n是可供选择的元素的数量,其中接受的答案具有远低于'n`的预期运行时间. (7认同)
  • @SagarGautam我认为你应该接受这个答案.这显然是一个比你接受的答案更好的答案. (4认同)
  • @lexicore这并没有使它"显然是一个更好的答案" - 这使它成为一个更完整的答案.Amer的算法在很多方面都优于Eran(虽然Eran更适合于重复使用). (3认同)

Ame*_*bsa 9

你可以使用Set它,想法是生成你的随机数,然后把它放在一个集合中并继续这样做,直到你的集合中有4个元素,完成后你将有4个独特的随机数存储在你的集合中

Set<Integer> randomSet = new HashSet<>();

while(randomSet.size() <4) 
   randomSet.add //add your generated random number
Run Code Online (Sandbox Code Playgroud)

  • 如果你用LinkedHashSet替换HashSet,你实际上也会得到随机顺序. (5认同)
  • @SagarGautam套装本身并未订购. (4认同)

esc*_*ram 7

如果您可以创建一个快速函数f,将自然数映射到满足您要求的数字集,则只能生成一个随机数.然后你的运行时间受到f的限制.如果您可以创建一个相当快的f,这是最有效的方法.

最简单的解决方案是将满足条件的所有数字放在一个数组中,并创建一个随机数作为该数组的索引. - > O(1)


ste*_*ert 7

如您所见,有很多方法可以实现您的目标.这是我的建议

Random random = new Random();

// prepare all valid digits
List<Integer> from = new ArrayList<Integer>(Arrays.asList(0,1,2,3,4,5,6,7,8,9));

// take set in an random order
int numbers[] = new int[4];
for(int i = 0; i < numbers.length; i++){
    numbers[i] = from.remove (random.nextInt (from.size()));
}

for (int num : numbers) {
   System.out.println(num); // when you prefer this
}
Run Code Online (Sandbox Code Playgroud)