Python rng种子的数目

Python rng种子的数目,python,random,Python,Random,在用于从种子初始化随机数的文档(python 3.5)中: random.seed(a=None,version=2) 初始化随机数生成器 如果省略或无,则使用当前系统时间。如果 随机性源由操作系统提供,它们被使用 而不是系统时间(有关详细信息,请参阅os.uradom()函数) (视可用性而定) 如果a是int,则直接使用它 对于版本2(默认),str、bytes或bytearray对象 转换为整数并使用其所有位。在版本1中 而使用的是 它不清楚有多少种子。int通常只有40亿个不同的值,但p

在用于从种子初始化随机数的文档(python 3.5)中:

random.seed(a=None,version=2)

初始化随机数生成器

如果省略或无,则使用当前系统时间。如果 随机性源由操作系统提供,它们被使用 而不是系统时间(有关详细信息,请参阅os.uradom()函数) (视可用性而定)

如果a是int,则直接使用它

对于版本2(默认),str、bytes或bytearray对象 转换为整数并使用其所有位。在版本1中 而使用的是

它不清楚有多少种子。int通常只有40亿个不同的值,但python包含任意精度:

x = 1
type(x) # <class 'int'>
y = 123456789123456789123456789123456789123456789123456789123456789123456789
type(y) # <class 'int'>
z = x+y
z-y # 1 (no rounding error for a 71 digit number)
x=1
类型(x)#
y=12345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456789
类型(y)#
z=x+y
z-y#1(71位数字无舍入误差)

他们说它的所有位都被使用了,但这可能意味着这些位被用来生成一个正常的32位int的摘要。这有什么关系?我需要一个从种子随机模式。接下来,我需要创建随机的模式序列(序列中有一个种子)。随机数生成器流将受到“生日攻击”,在这种攻击中,如果只有32位,则在大约10万次之后几乎肯定会出现重复。虽然这不是用于加密,但仍然不可取

开源的好处在于能够简单地用问题查看代码。这是:

您可以看到,如果提供了
version==2
str
/
字节
,那么它将获取
a
的SHA512,将其追加,并使用
int.from_bytes
,生成非常大的int并保证至少512位种子,即使使用非常小的自定义输入


如下文所述,最终结果是保证种子的长度至少为624位。

“super().seed(a)”是进一步消化这个512位散列的超级种子还是真正的512位种子?我认为
super().seed(a)
之后
a
的情况也相关。来源是<代码>随机种子()。。我还在消化它。这个评论“这个算法依赖于无符号的数字。所以:如果arg是一个PyLong,使用它的绝对值。否则使用它的散列值,强制转换为无符号。”似乎暗示种子最终只是一个
PyLong
。啊。。但是,这会导致我们找到
init\u by\u array()
,它被传递一个32位整数的数组。这里似乎是设置长度的地方:
k=(N>key\u length?N:key\u length)其中
N
624
——但这是最小值而不是最大值。在我看来,它没有实现最大长度。
if a is None:
    try:
        # Seed with enough bytes to span the 19937 bit
        # state space for the Mersenne Twister
        a = int.from_bytes(_urandom(2500), 'big')
    except NotImplementedError:
        import time
        a = int(time.time() * 256) # use fractional seconds

if version == 2:
    if isinstance(a, (str, bytes, bytearray)):
        if isinstance(a, str):
            a = a.encode()
        a += _sha512(a).digest()
        a = int.from_bytes(a, 'big')

super().seed(a)
self.gauss_next = None