在用于从种子初始化随机数的文档(python 3.5)中:
random.seed(a =无,版本= 2)
初始化随机数生成器。
如果省略a或无,则使用当前系统时间。如果
随机性源由操作系统提供,用于
而不是系统时间(有关详细信息,请参见os.urandom()函数)
可用性)。
如果a是一个int,则直接使用它。
在版本2(默认设置)中,可以获取str,bytes或bytearray对象
转换为int并使用其所有位。对于版本1,
而是使用a的hash()。
尚不清楚有多少种子。一个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)
他们说它的所有位都被使用了,但这可能意味着这些位被用来构成一个普通的32位int的摘要。为什么这么重要?我需要从种子制作随机图案。反过来,我需要制作随机的图案序列(该序列又有种子)。一串随机数生成器将受到“生日攻击”,在这种情况下,大约只有十万位,如果经过十万左右,几乎肯定会重复。尽管这不是用于密码学的,但这仍然是不可取的。
最佳答案
开源的最大好处是能够简单地查看带有问题的代码。这是source of random.seed
:
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
您可以看到,如果提供了
version == 2
和str
/ bytes
,它将采用a
的SHA512,将其追加并使用int.from_bytes
,生成一个非常大的int并保证至少512位种子,即使使用很小的自定义输入也是如此。如下所述,最终结果是保证种子的长度至少为624位。
关于python - Python种子数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37927577/