5

如果没有提供明确的种子值,Python 如何播种内置随机库中使用的 Mersenne twister 伪随机数生成器?它是否以某种方式基于时钟?如果是这样,是在导入随机模块时还是第一次调用时找到了种子?

Python 的文档似乎没有答案。

4

3 回答 3

3

在现代版本的 python (cf http://svn.python.org/projects/python/branches/release32-maint/Lib/random.py ) Random.seed 尝试使用从 /dev/urandom 读取的 32 个字节。如果这不起作用,则使用当前时间:(a是一个可选值,可用于显式播种 PRNG。)

    if a is None:
        try:
            a = int.from_bytes(_urandom(32), 'big')
        except NotImplementedError:
            import time
            a = int(time.time() * 256) # use fractional seconds
于 2013-07-14T03:54:01.407 回答
2

从这个答案中,我找到了 random.py 的来源。在 Random 类中,在构造对象时设置种子。该模块实例化一个 Random 对象并将其用于所有模块方法。因此,如果随机数是使用random.random()其他模块方法生成的,那么种子是在导入时设置的。如果随机数是由另一个 Random 实例产生的,那么种子是在构造该实例时设置的。

从来源:

# Create one instance, seeded from current time, and export its methods
# as module-level functions.  The functions share state across all uses
#(both in the user's code and in the Python libraries), but that's fine
# for most programs and is easier for the casual user than making them
# instantiate their own Random() instance.
于 2013-07-14T03:26:26.173 回答
2

种子基于时钟或(如果可用)操作系统源。该random模块在导入时创建(并因此播种)共享Random实例,而不是在首次使用时。

参考

random.seed 的 Python 文档

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

初始化随机数生成器。

如果省略 a 或 None,则使用当前系统时间。如果操作系统提供随机源,则使用它们而不是系统时间(有关可用性的详细信息,请参见 os.urandom() 函数)。

random.py 的来源(严重剪断):

from os import urandom as _urandom

class Random(_random.Random):

    def __init__(self, x=None):
        self.seed(x)

    def seed(self, a=None, version=2):
        if a is None:
            try:
                a = int.from_bytes(_urandom(32), 'big')
            except NotImplementedError:
                import time
                a = int(time.time() * 256) # use fractional seconds

# Create one instance, seeded from current time, and export its methods
# as module-level functions.  The functions share state across all uses
#(both in the user's code and in the Python libraries), but that's fine
# for most programs and is easier for the casual user than making them
# instantiate their own Random() instance.

_inst = Random()

最后一行位于顶层,因此在加载模块时执行。

于 2013-07-14T03:57:17.897 回答