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