0

我正在尝试在 java 中创建一个彩票模拟器,我开始担心我生成的数字是否足够随机。

例如,我用于生成不重复的白球号码的代码如下所示。

public static int[] genWhiteNums()
{
    int[] whitePicks = new int[5];
    Collections.shuffle(whiteDrawNums); //whiteDrawNums is an arraylist of numbers 1-59

    for(int i = 0; i < 5; i++)
    {
        whitePicks[i] = whiteDrawNums.get(i);
    }
    whiteDrawNums = createWhiteNums(); //Reordering

    return whitePicks;
}

从 Collections.shuffle 中选择前 5 个值是否足够随机?

4

3 回答 3

3

根据这里的文档

使用默认随机源随机排列指定列表。所有排列都以大致相等的可能性发生。

在前面的描述中使用了“大约”对冲,因为默认的随机源只是大约独立选择位的无偏源。如果它是随机选择的比特的完美来源,那么该算法将选择具有完美一致性的排列。

它使用线性时间改组算法。我认为它足够随机,可以满足大多数人的需求。

于 2013-05-24T18:06:54.380 回答
2

Collections.shuffle 执行Fisher-Yates shuffle。如果它足够随机,它在你的考虑范围内

于 2013-05-24T18:05:06.847 回答
0

用于Random#nextInt()从您的洗牌集合中挑选充分分布的随机值。

public static int[] genWhiteNums() {
    Random random = new Random();

    int[] whitePicks = new int[5];
    Collections.shuffle(whiteDrawNums);  // Arraylist 1-59

    for (int i = 0; i < whitePicks.length; i++) {
        whitePicks[i] = whiteDrawNums.get(
                        random.nextInt(i != 4 ? 12 : 11) + 12 * i);
    }

    whiteDrawNums = createWhiteNums(); // Reordering
    return whitePicks;
}

它将可用索引 (0-58) 分成 4 组,每组 12 个,最后一组 11 个,并在循环的每次迭代中选择一个随机索引。这应该足以满足您对随机性的需求。

于 2013-05-24T20:08:46.353 回答