根据下面提供的代码,我如何预测种子或确定生成的数字?
from random import randint, seed, sample
seed(randint(1, 2^256))
numbers = sample(range(1, 50), 6)
到目前为止,我已经尝试设置相同的当地时间,这通常适用于重现结果。但是,我需要一种不同的方法。
如何预测种子或确定生成的数字?
通过阅读所涉及的所有内容的源代码,然后在虚拟环境中逐行运行以重现结果。最重要的是,通过模拟了解启动条件。
randint
在这里实现https://github.com/python/cpython/blob/5c89adf385aaaca97c2ee9074f8b1fda0f57ad26/Lib/random.py#L336基于randrange https://github.com/python/cpython/blob/5c89adf385aaaca97c2ee9074f8b1fda0f57ad26/Lib/random.py#L295基于https://github.com/python/cpython/blob/main/Lib/random.py# L275 _randbelow 是基于getrandbits https://github.com/python/cpython/blob/main/Lib/random.py#L893 调用 _random ,其实现于:
Used sources of entropy ordered by preference, preferred source first:
- BCryptGenRandom() on Windows
- getrandom() function (ex: Linux and Solaris): call py_getrandom()
- getentropy() function (ex: OpenBSD): call py_getentropy()
- /dev/urandom device
现在它得到了非常的架构,特定于硬件。您必须跟踪您的操作系统及其实现,并且使用硬件随机生成器可能会变得更加棘手。