我正在尝试在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个值吗?
答案 0 :(得分:3)
根据文件here
使用默认来源随机置换指定列表 随机性。所有排列都大致相等 可能性。
树篱“大约”用于前面的描述中,因为 randomenss的默认来源只是一个无偏见的来源 独立选择的位。如果它是随机的完美来源 选择的位,然后算法将选择完美的排列 均匀性。
它使用线性时间混洗算法。我认为这足以满足大多数人的需求。
答案 1 :(得分:2)
Collections.shuffle执行Fisher-Yates shuffle。如果它足够随机,那就是你的考虑因素
答案 2 :(得分: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,并在循环的每次迭代中选择一个随机索引。这足以满足您对随机性的充分需求。