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

mt19937 prng是如何准确地用于python随机模块函数的?,python,random,mt19937,Python,Random,Mt19937,我用Python3.8.2运行了这个程序(这并不重要)。这不是我所期望的MT19937 32位PRNG。确切地说,我期望的值与本网站中给出的值相似: Python与其他语言有什么不同?有没有一种方法可以让我自己复制Python生成的比特?(另外,如何从32位字大小的整数生成从0到1的random()浮点?) 谢谢 Python的种子算法与link使用的算法完全不同。Twister有一个巨大的状态,只有32位的种子只能将它放入一个相对较少的可能状态中。Python的种子算法使用任意大的参数 要复制

我用Python3.8.2运行了这个程序(这并不重要)。这不是我所期望的MT19937 32位PRNG。确切地说,我期望的值与本网站中给出的值相似:

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


谢谢

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

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

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

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

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

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

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

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

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

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

谢谢您的解释!这很有帮助。我浏览了一下C代码(目前还没有实际仿真)。种子设定算法似乎首先正常地(使用OG algo)设定一个幻数19650218U,然后继续使用自定义init函数,使用pyobject散列到的所有位。我有点好奇的是,正如源代码中的常量所暗示的,在这个日期发生了什么。你有什么线索吗?好问题!根据“常数19650218是作者之一的生日,选择它是没有理由的”:-)注意C种子代码并不是故事的全部-你也需要看看
random.py
seed()。不推荐使用基于哈希的种子设定。在C代码中,您缺少
PyLong_CheckExact()
路径,该路径使用一个(可能是巨大的)非负整数,而C
init_by_array()
会传递其所有位。感谢您的解释!这很有帮助。我浏览了一下C代码(目前还没有实际仿真)。种子设定算法似乎首先正常地(使用OG algo)设定一个幻数19650218U,然后继续使用自定义init函数,使用pyobject散列到的所有位。我有点好奇的是,正如源代码中的常量所暗示的,在这个日期发生了什么。你有什么线索吗?好问题!根据“常数19650218是作者之一的生日,选择它是没有理由的”:-)注意C种子代码并不是故事的全部-你也需要看看
random.py
seed()。不推荐使用基于哈希的种子设定。在C代码中,您缺少
PyLong\u CheckExact()
路径,该路径原样使用一个(可能是巨大的)非负整数,并且C
init\u by\u array()
传递其所有位。