mt19937 prng是如何准确地用于python随机模块函数的?

2024-05-15 10:01:52 发布

您现在位置:Python中文网/ 问答频道 /正文

from random import *
seed(5489)
hex(getrandbits(32)) # '0xc9a0e034'
hex(getrandbits(32)) # '0x38feb21f'

我用Python3.8.2运行了这个程序(这并不重要)。这不是我所期望的MT19937 32位PRNG。确切地说,我期望的值与本网站中显示的值相似:https://create.stephan-brumme.com/mersenne-twister/

Python与其他语言有什么不同?有没有一种方法可以让我自己复制Python生成的比特?(另外,如何从32位字大小的整数生成从0到1的random()浮点?)

谢谢


Tags: fromhttpsimport程序com网站createrandom
1条回答
网友
1楼 · 发布于 2024-05-15 10:01:52

Python的种子算法与链接使用的算法完全不同。Twister有一个巨大的状态,只有32位的种子只能将它放入一个相对较少的可能状态中。Python的种子算法使用任意大的参数

要复制Python的种子算法,您必须阅读C代码并自己进行仿真。关于它没有任何定义

Python生成IEEE double的代码与Twister原始C代码中的genrand_res53()函数相同:

uint32_t a=genrand_uint32(self)>>5, b=genrand_uint32(self)>>6;
return PyFloat_FromDouble((a*67108864.0+b)*(1.0/9007199254740992.0));

实际上,一个32位捻线器输出的前27位左移26,“下一个”32位捻线器输出的前26位填充下26位,给出一个53位值除以2.0**53

相关问题 更多 >