python随机种子数_关于随机:rng种子的Python数量

本文探讨了Python中random.seed()函数的用法,包括如何使用种子初始化随机数生成器。当种子为None时,系统会利用当前时间或os.urandom()来生成种子。对于整数种子,它可能包含任意精度的位。为了防止生日攻击,Python使用SHA512对种子进行处理,确保至少512位的种子长度。尽管如此,初始化数组的长度限制为624位,没有明确的最大长度限制。这引发了关于种子安全性和随机数序列多样性的讨论。
摘要由CSDN通过智能技术生成

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

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

Initialize the random number generator.

If a is omitted or None, the current system time is used. If

randomness sources are provided by the operating system, they are used

instead of the system time (see the os.urandom() function for details

on availability).

If a is an int, it is used directly.

With version 2 (the default), a str, bytes, or bytearray object gets

converted to an int and all of its bits are used. With version 1, the

hash() of a is used instead.

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

x = 1

type(x) #

y = 123456789123456789123456789123456789123456789123456789123456789123456789

type(y) #

z = x+y

z-y # 1 (no rounding error for a 71 digit number)

他们说所有的位都被使用了,但这可能意味着这些位被用来做一个正常的32位整数的摘要。为什么这很重要?我需要一个随机的种子模式。反过来,我需要生成随机的模式序列(顺序依次有一个种子)。一个随机数生成器流将受到"生日攻击",其中在大约10万之后,如果只有32位,几乎肯定会有一个副本。虽然这不适用于密码术,但仍然是不可取的。

开放源码最棒的是能够简单地查看带有问题的代码。这是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位。

"super().seed(a)"是超级进一步消化这个512位散列,还是真正的512位种子?

我认为这也与super().seed(a)之后a发生的情况有关。源代码是github.com/python/cpython/blob/……random_seed()。我还在消化它。

此注释"此算法依赖于无符号的数字。所以:如果arg是塔架,使用它的绝对值。否则使用散列值,强制转换为无符号。"似乎意味着种子最终只是一个PyLong。啊…但是PyLong可以是任意大小。

它将我们引导到init_by_array(),它将传递一个32位整数数组。

"不变的19650218是作者之一的生日"。这里似乎是设置长度的地方:k = (N>key_length ? N : key_length);,其中N是624,但这是最小值而不是最大值。在我看来,它没有实现最大长度。

@库皮亚科斯,你可以把它融入你的答案中…

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值