所以我在测试一个游戏中骰子掷骰概率的计算方法。 基本情况下,如果滚动10边模具。
我做了一百万个样本,结果得到了如下比例:
Result
0 0.000000000000000%
1 10.038789961210000%
2 10.043589956410000%
3 9.994890005110000%
4 10.025289974710000%
5 9.948090051909950%
6 9.965590034409970%
7 9.990190009809990%
8 9.985490014509990%
9 9.980390019609980%
10 10.027589972410000%
这些当然都应该是10%。 这些结果的标准偏差为0.0323207%。 对我来说,这似乎很高。 只是巧合吗? 据我所知,随机模块访问适当的伪随机数。 即那些通过统计检验的方法是随机的。 或者这些是伪随机数生成器
我应该使用加密伪随机数生成器吗? 我很确定我不需要一个true随机数生成器(参见http://www.random.org/,http://en.wikipedia.org/wiki/Hardware_random_number_generator)。
我正在用10亿个样本重新生成我所有的结果, (因为为什么不呢,我有一个松脆的服务器在我的支配下,还有一些睡眠要做)
Martijn的答案是对Python可以访问的随机数生成器的一个非常简洁的回顾。
如果要检查生成的伪随机数据的属性,请从http://www.fourmilab.ch/random/下载
random.zip
,并在大样本随机数据上运行它。特别是卡方检验对随机性非常敏感。对于一个真正随机的序列,来自x2检验的百分比应该在10%到90%之间。对于一个游戏,我猜Python内部使用的Mersenne Twister应该足够随机(除非您正在构建一个在线赌场:-)。
如果您想要纯随机性,并且您使用的是Linux,那么可以从
/dev/random
中读取。这只会从内核的熵池(从不可预测的中断到达时间收集)生成随机数据,因此如果耗尽它,它将阻塞。此熵用于初始化(种子)由/dev/urandom
使用的PRNG。在FreeBSD上,为/dev/random
提供数据的PRNG使用Yarrow算法,该算法通常被认为是加密安全的。编辑:我对来自
random.randint
的字节运行了一些测试。首先创建一百万个随机字节:然后我从Fourmilab上运行
ent
程序:现在对于x2检验,你从50%得到的越远,数据就越可疑。如果非常挑剔,则认为10%或90%的值是不可接受的。John Walker是
ent
一书的作者,他称这个值“几乎是可疑的”。作为对比,这里是我之前运行的对FreeBSD的Yarrow prng中的10 MiB的相同分析:
其他数据差异不大,但χ2检验结果远远接近50%。
我用10亿次迭代重播了OP的练习:
下面是(重新格式化的)结果:
请参阅此问题的其他答案,以了解其出色的分析。
从^{} module documentation :
从Wikipedia article on the Mersenne Twister:
如果您有一个特定于操作系统的随机性源,可以通过^{} 获得,那么您可以使用^{} 类代替。大多数
random
模块函数都可用作该类的方法。它可能更适合于加密目的,再次引用文档:Python 3.6添加了一个^{} module 和方便的方法来生成适合加密目的的随机数据:
相关问题 更多 >
编程相关推荐