Pythons是random.randint统计随机吗?

Lyn*_*ite 5 python random statistics probability

所以我正在测试计算游戏中某些骰子掷骰的概率.如果滚动的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%
Run Code Online (Sandbox Code Playgroud)

这些当然应该都是10%.这些结果的标准偏差为0.0323207%.对我来说,这似乎相当高.这只是巧合吗?据我了解,随机模块访问适当的伪随机数.即通过统计测试的方法是随机的.或者是这些伪伪随机数生成器

我应该使用加密伪随机数生成器吗?我相当肯定,我并不需要一个真正的随机数发生器(见http://www.random.org/,http://en.wikipedia.org/wiki/Hardware_random_number_generator).

我目前正在用10亿个样本重新生成我的所有结果,(为什么不,我有一个脆弱的服务器供我使用,还有一些睡觉要做)

Mar*_*ers 15

random模块文档:

几乎所有模块函数都依赖于基本函数random(),它在半开放范围[0.0,1.0]内均匀生成随机浮点数.Python使用Mersenne Twister作为核心生成器.它产生53位精度浮点数,周期为2**19937-1.C中的底层实现既快又线程安全.Mersenne Twister是现存最广泛测试的随机数发生器之一.但是,完全确定性,它不适用于所有目的,并且完全不适合加密目的.

来自维基百科关于Mersenne Twister的文章:

它提供了快速生成非常高质量的伪随机数,专门用于纠正旧算法中的许多缺陷.

如果您有可用的特定于操作系统的随机源os.urandom(),则可以使用random.SystemRandom()该类.大多数random模块函数都可以作为该类的方法使用.它可能更适合加密目的,再次引用文档:

对于加密应用程序,返回的数据应该是不可预测的,尽管其确切的质量取决于操作系统的实现.

Python 3.6添加了一个带有便捷方法的secrets模块,用于生成适合加密目的的随机数据:

secrets模块用于生成适用于管理密码,帐户认证,安全令牌和相关机密等数据的加密强随机数.

特别是,secrets应该优先使用模块中的默认伪随机数生成器random,它是为建模和模拟而设计的,而不是安全性或加密.


Rol*_*ith 3

Martijn 的回答是对 Python 可以访问的随机数生成器的相当简洁的回顾。

\n\n

如果您想查看生成的伪随机数据的属性,请random.ziphttp://www.fourmilab.ch/random/下载下载,并在大量随机数据样本上运行它。尤其是\xcf\x87\xc2\xb2(卡方)检验对随机性非常敏感。对于真正随机的序列,\xcf\x87\xc2\xb2 测试的百分比应在 10% 到 90% 之间。

\n\n

对于游戏,我猜想 Python 内部使用的 Mersenne Twister 应该是足够随机的(除非你正在构建一个在线赌场:-)。

\n\n

如果您想要纯粹的随机性,并且您使用的是 Linux,则可以从/dev/random. 这只会从内核的熵池中产生随机数据(从中断到达的不可预测的时间中收集),因此如果您耗尽它,它将阻塞。该熵用于初始化(种子) 所使用的 PRNG /dev/urandom。在 FreeBSD 上,PRNG 为/dev/random使用 Yarrow 算法,该算法通常被认为是加密安全的。

\n\n

编辑:我对来自的字节进行了一些测试random.randint。首先创建一百万个随机字节:

\n\n
import random\nba = bytearray([random.randint(0,255) for n in xrange(1000000)])\nwith open(\'randint.dat\', \'w+\') as f:\n    f.write(ba)\n
Run Code Online (Sandbox Code Playgroud)\n\n

然后我运行了Fourmilabent的程序在上面

\n\n
Entropy = 7.999840 bits per byte.\n\nOptimum compression would reduce the size\nof this 1000000 byte file by 0 percent.\n\nChi square distribution for 1000000 samples is 221.87, and randomly\nwould exceed this value 93.40 percent of the times.\n\nArithmetic mean value of data bytes is 127.5136 (127.5 = random).\nMonte Carlo value for Pi is 3.139644559 (error 0.06 percent).\nSerial correlation coefficient is -0.000931 (totally uncorrelated = 0.0).\n
Run Code Online (Sandbox Code Playgroud)\n\n

现在对于 \xcf\x87\xc2\xb2 测试,距离 50% 越远,数据就越可疑。如果一个人非常挑剔,则值 <10% 或 >90% 被视为不可接受。约翰·沃克,作者ent称这个值“几乎令人怀疑”。

\n\n

作为对比,下面是我之前运行的对来自 FreeBSD 的 Yarrow prng 的 10 MiB 的相同分析:

\n\n
Entropy = 7.999982 bits per byte.\n\nOptimum compression would reduce the size\nof this 10485760 byte file by 0 percent.\n\nChi square distribution for 10485760 samples is 259.03, and randomly\nwould exceed this value 41.80 percent of the times.\n\nArithmetic mean value of data bytes is 127.5116 (127.5 = random).\nMonte Carlo value for Pi is 3.139877754 (error 0.05 percent).\nSerial correlation coefficient is -0.000296 (totally uncorrelated = 0.0).\n
Run Code Online (Sandbox Code Playgroud)\n\n

虽然其他数据似乎没有太大差异,但 \xcf\x87\xc2\xb2 的比例却很大50%。

\n