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

时间:2017-08-27 09:36:39

标签: java random numbers

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

import React, { Component } from 'react';

export default class auth extends Component {

    constructor(props) {
        super(props)

        const user = localStorage.getItem('user')
        if(!user) {
            window.location = '/login'
        }
    }

    render() {
        return (
            <div></div>
        );
    }
}

有了这个,我可以轻松获得四个数字的数组, 9369 4702 等。 在这种情况下,可能有一个数字可以重复四个数字,我不希望这样重复。

在这里,我想让上面数组中的所有四位数都是唯一的,这样我就可以获得 9543 1234 等输出。

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

  1. 生成随机数并指定为第一个数字。
  2. 生成一个随机数并检查第一个数字是否另有指定为第二个数字,否则再次生成随机数并重复等等。
  3. 有没有比上述方法更好的方法,以便我可以轻松快速地获得四个独特的随机数?

    任何建议都表示赞赏。

5 个答案:

答案 0 :(得分: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);
}

答案 1 :(得分:9)

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

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

while(randomSet.size() <4) 
   randomSet.add //add your generated random number

答案 2 :(得分:7)

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

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

答案 3 :(得分: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
}

答案 4 :(得分:0)

修改

  

由于Collections.shuffle也使用fisher-yates算法。但是这种变体正在选择序列的起点。   这就像洗牌一副牌,从中间选择4张牌,然后洗牌,从顶部选择4张牌。

以下是https://softwareengineering.stackexchange.com/questions/199644/efficient-way-to-shuffle-objects

中提到的F​​isher-Yeats改组算法的变体
    public int[] shuffle() {
        int a[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
        Random r = new Random();
        for (int i = a.length; i > 1; i--) {
            swap(a, i - 1, r.nextInt(i));
        }

        int[] result = new int[4];
        // Variant :: Randomly choosing the starting point of the 
        // sequence, since we need only four number.
        System.arraycopy(a, r.nextInt(a.length - 4), result, 0, 4);
        return result;
    }

    private void swap(int[] a, int i, int i1) {
        int temp = a[i];
        a[i] = a[i1];
        a[i1] = temp;
    }

参考:https://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle