Python MT19937RNG如何生成小于32位的随机数?

Python MT19937RNG如何生成小于32位的随机数?,python,random,cryptography,Python,Random,Cryptography,我们知道python中的random模块使用MT19937生成32位随机数,例如: >>> import random >>> random.seed(123) >>> random.getrandbits(32) 224899942L >>> random.getrandbits(32) 1149664691L >>> random.getrandbits(32) 374463918L >>&

我们知道python中的
random
模块使用MT19937生成32位随机数,例如:

>>> import random
>>> random.seed(123)
>>> random.getrandbits(32)
224899942L
>>> random.getrandbits(32)
1149664691L
>>> random.getrandbits(32)
374463918L
>>> random.getrandbits(32)
3302642556L
当我设置相同的种子时,输出与MT19937的输出相同

然而,如果我想生成一个小于32位的随机数,例如,如果我想使用random.getrandbits(1)生成一个1位的随机数,起初我认为结果只是随机的。getrandbits(32)&1,但当我付诸实践时,我发现情况并非如此:

>>> import random
>>> random.seed(123)
>>> random.getrandbits(1)
0L
>>> random.getrandbits(1)
0L
>>> random.getrandbits(1)
0L
>>> random.getrandbits(1)
1L
现在我不知道为什么输出变成
0,0,0,1…
,这些数字是从哪里来的

我们都知道,如果我们得到由MT19937RNG生成的624个连续的32位随机数,我们可以很容易地恢复种子并计算任何随机数,但是如果我们只能得到小于32位的连续随机数,比如1位,我们还能破坏MT19937RNG吗

random.getrandbits(1)
的输出变成0,0,0,1…,这些数字来自哪里

这些是
random.getrandbits(32)
结果的高阶位。只需查看文件
Modules/\u randommodule.c

if (k <= 32)  /* Fast path */
    return PyLong_FromUnsignedLong(genrand_int32(self) >> (32 - k));
if(k>(32-k));
如果我们只能得到小于32位的连续随机数,比如1位,我们还能破坏MT19937RNG吗

对。当然,我们需要32倍以上的价值观。基本上,我们把状态的19937位作为未知数,为我们知道的每一位写出这些变量的一个线性方程,然后求解