我怎么知道这是否足够随机?

时间:2010-04-14 21:31:19

标签: language-agnostic math random

我在java中编写了一个程序来滚动一个骰子并记录每个值1-6被滚动的总次数。我滚了600万次。这是分布:

#of 0's: 0
#of 1's: 1000068
#of 2's: 999375
#of 3's: 999525
#of 4's: 1001486
#of 5's: 1000059
#of 6's: 999487

(0不是一个选项。)

这种分布是否与随机骰子卷一致? 什么客观的统计测试可能证实骰子卷确实是随机的?

编辑:已经提出了一些关于申请的问题:一个我想要合理地实现公平的游戏。

4 个答案:

答案 0 :(得分:5)

要测试此特定分布是否与通过“公平”潜水推送的数字的预期分布一致,您需要执行Pearson's Chi-square test

请注意,这仍然不能证明您的算法是“公平的”,只是这些特定结果看起来“公平”。

要测试您的算法一般是否“公平”,请使用Diehard tests,正如其他人所提到的那样。

答案 1 :(得分:4)

如果你的随机数发生器通过了Diehard测试,那就是你能做到的最好的。

即使是物理模具也不是完美的,每面1/6。

将试验增加一个数量级,然后再次进行。如果每次试验得到1/6,你就可以了。

答案 2 :(得分:1)

仅此测试不足以确定随机性。并不是说它完全没用,但根据这个测试,输出1,2,3,4,5,6和重复的“随机”骰子滚轮将是完全随机的。

另一个建议的测试:选择一个数字x,每次滚动时,记录下一个数字的统计数据;你应该再次看到均匀分布。重复x的所有六个值。如果它通过了这个测试,它可能是随机的,可以用作骰子滚轮。

答案 3 :(得分:0)

6'000'000骰子滚动的概率最终恰好在每个1000'000的结果中接近0.只要结果的总和是正确的,并且方差(误差)当试验次数增加时,与预期结果的差异趋向0(相对),那么你的随机函数没有错误。

你可以用数学方法证明它,也可以用越来越大的试验序列测试随机函数,看它是否收敛。

对于重复次数的测试,每个结果的总和应接近高斯分布。例如。每个结果1-6应该落在以1000'000为中心的正态分布范围内,方差与骰子数量成反比。

其他测试,Diehard测试,测试骰子卷的实际顺序本身是随机的,而不是例如6'000'000卷的结果是100'000连续1,然后是100'000 2和等等,最后是一些随机序列。