【问题标题】:How do i know if this is random enough?我怎么知道这是否足够随机?
【发布时间】:2011-02-08 03:09:24
【问题描述】:

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

这种分布是否与随机掷骰子一致? 哪些客观的统计测试可以证实掷骰子确实足够随机?

编辑:关于应用程序的问题已经提出:我希望尽可能公平地实现一个游戏。

【问题讨论】:

  • 无论您使用什么应用程序来确定算法是否“足够随机”。此外,顺序在您的应用程序中可能很重要;如果 1 可能对您的情况“不利”,则为字符串。
  • 分布足够一致。你曾经花时间在 random.org 上吗?可能是您开始的好地方。
  • 我认为这是你需要检查的:你经历的迭代越多,结果应该接近每个骰子数字的 1/6 分布。
  • @M.A. Hanin:更准确地说,你应该检查每卷数量的分布。即一千次滚动一千次,看看每组的个数是否符合预期分布。
  • 如果您只是使用内部 Java RNG 算法,您应该足够安全。这是没有人应该能够玩的东西吗?如果你自己动手,你可以向我们提供一些关于你做了什么以及你排除了什么的信息,这样我们就可以帮助你改进它。并不是说您必须提供任何业务信息,而是您分享的越多,社区就可以改进更多。

标签: language-agnostic math random


【解决方案1】:

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

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

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

【讨论】:

  • 顽固测试如何保证随机性?
  • Diehard 测试不保证随机性。没有什么可以保证随机性。 :-) Diehard 测试是一组自动化测试,旨在针对特定的随机生成器实现运行,以寻找统计证明该特定实现不是“公平”实现。如果您的生成器通过了 Diehard 测试,这并不意味着它是“公平的”并且保证了随机性;这只是意味着它很有可能是“公平的”
【解决方案2】:

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

每面 1/6,即使是物理骰子也不完美。

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

【讨论】:

  • 如果你得到大约每张脸的 1/6 ~ 从统计上你永远不应该得到每张脸的准确 1/6,这不是随机的。
  • 每张脸的 1/6 与任何其他可能的结果一样可能。我当然不会说某人应该“永远”得到它。
  • 我已经进行了 600 万次试验。这还不够增加吗?还有什么是 Diehard 测试?
  • @starblue 精确到 1/6 每次运行都是极不可能的。恰好 1/6 一次 与任何其他结果一样可能。
【解决方案3】:

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

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

【讨论】:

    【解决方案4】:

    掷出 6'000'000 个骰子最终会产生 1'000'000 个结果的概率接近于 0。只要结果的总和是正确的,并且当试验次数增加时,与预期结果的差异(相对)趋于 0,那么您的随机函数没有错。

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

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

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

    【讨论】:

    • 您能否更详细地了解方差、它的含义以及它是如何计算的?
    • 方差是衡量变量“随机”程度的指标。如果您使用 6 轮测试您的骰子随机性,您将在每个结果 [1-6] 上得到很大的差异,但如果您测试 6'000'000 次,则差异会低得多。将方差视为散布。无论如何,Diehard 测试与测试随机性更相关。
    猜你喜欢
    • 2021-12-08
    • 1970-01-01
    • 2018-12-03
    • 1970-01-01
    • 2022-10-19
    • 1970-01-01
    • 2011-04-03
    • 2021-10-05
    相关资源
    最近更新 更多