这是否足够随机?

13

我在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不是一个选项。)

这个分布是否符合随机掷骰子的特性?有哪些客观的统计测试可以确认骰子掷出的结果足够随机?

编辑:对于应用程序,已经提出了问题:我希望这个游戏尽可能公平。


2
无论您将此算法用于哪个应用程序,都会决定它是否“足够随机”。此外,在您的应用程序中,顺序可能很重要;如果一串1的字符串对您的情况来说可能是“不好的”。 - strager
1
分布足够一致。你曾经花时间在random.org上吗?这可能是一个适合你开始的好地方。 - jcolebrand
3
我认为你需要检查的是:经过更多迭代,结果应该更接近每个骰子面的1/6分布。 - M.A. Hanin
请注意,序列1、2、3、4、5、6、1、2、3、4、5、6、1...具有完全均匀的分布。因此,仅仅均匀性是不够的。 - user85109
这个问题应该在MathOverflow上发布。 - sal
显示剩余2条评论
4个回答

5
要测试这个分布是否与使用“公平”骰子掷出的数字的预期分布一致,您需要执行Pearson's Chi-square test
请注意,这仍然不能证明您的算法是“公平”的,只是这些特定结果看起来“公平”。
要测试您的算法是否普遍“公平”,请使用其他人提到的Diehard tests

如何保证随机性的死板测试? - David
2
Diehard测试并不能保证随机性。没有任何东西可以保证随机性。 :-) Diehard测试是一组自动化测试,旨在针对特定的随机生成器实现运行,以寻找统计证据表明该特定实现不是“公平”的实现。如果您的生成器通过了Diehard测试,并不意味着它是“公平”的,随机性得到了保证;这只是意味着有很高的可能性它可能是“公平”的。 - Franci Penov

4
如果您的随机数生成器通过了Diehard测试,那么这已经是您能做到的最好了。
即使是物理骰子也不可能每个面都完美,只有1/6的概率。
将试验次数增加一个数量级,再进行测试。如果每次试验都得到1/6的结果,那么就没问题了。

1
如果你每个面大约得到1/6的机会,从统计学上讲,你永远不应该完全得到每个面的1/6,因为那不是随机的。 - jcolebrand
3
每个面的概率都是相等的,每种可能的结果出现的概率都是一样的,其中1/6的概率不会比其他任何可能结果更高。我肯定不会说某人“永远”不可能得到它作为结果。 - jemfinch
1
请点击此处获取代码:http://www.stat.fsu.edu/pub/diehard/。关于该测试的详细信息,请参见:http://en.wikipedia.org/wiki/Diehard_tests。 - Dusty
@jemfinch,确实如此。我倾向于认为完全均匀的分割对于预期来说过于奇怪,但你是正确的。如果在600次掷骰子中读取100,100,100,100,100,100,我会认为逻辑上有些问题。但是看到99,100,101,100,99,101,我就不会有任何疑问。也许只有我这样想。 ~请考虑修改我的先前帖子,好吗? - jcolebrand
2
@starblue 每次运行恰好1/6的概率非常小。恰好1/6 一次 与任何其他结果一样可能。 - jemfinch
显示剩余4条评论

1

仅凭这个测试是不足以确定随机性的。虽然它并非完全无用,但一个“随机”的骰子掷出1、2、3、4、5、6并重复的结果将根据此测试完全随机。

另一个建议的测试:选择一个数字x,在每次掷骰时记录下接下来出现的数字的统计数据;您应该再次看到均匀分布。对于所有六个x值重复此过程。如果通过了这个测试,那么它很可能足够随机,可以用作骰子掷子器。


0

掷 6,000,000 次骰子,每种结果恰好出现 1,000,000 次的概率接近于 0。只要结果总和正确,并且当试验次数增加时,差异与期望结果的方差(误差)趋近于 0(相对地),则您的随机函数就不会有问题。

您可以通过数学证明或使用更大的试验序列测试随机函数以查看其是否收敛。

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

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


你可以详细解释一下方差是什么意思以及如何计算吗? - David
方差是衡量变量“随机性”的一种度量。如果您使用6轮测试您的骰子随机性,您将在每个结果[1-6]上获得大的方差,但如果您进行600万次测试,则方差将更低。将方差视为分散程度。无论如何,Diehard测试对于测试随机性更为相关。 - Ernelli

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接