Python的random: 如果不使用种子(someValue)会怎样?

22 投票
3 回答
11875 浏览
提问于 2025-04-15 11:23

a) 在这种情况下,随机数生成器每次运行时会使用系统时钟吗?这样会导致种子值变化吗?

b) 生成expovariate(lambda)的伪随机值时,使用的种子是什么?

3 个回答

3

当前的系统时间会被使用;在模块第一次被导入时,当前的系统时间也会用来初始化生成器。如果操作系统提供了随机性来源,那么这些来源会被用来代替系统时间(想了解更多,可以查看os.urandom()函数的相关内容)。

随机文档

6

a) 通常情况下,它会使用系统时钟。有些系统的时钟精度可能只有毫秒,所以如果很快连续调用两次,就可能得到相同的值。

seed(self, a=None) 从可哈希对象初始化内部状态。

None or no argument seeds from current time or from an operating
system specific randomness source if available.

http://pydoc.org/2.5.1/random.html#Random-seed

b) 我想expovariate应该是这样做的,但我找不到证据。如果它不这样做,那就太傻了。

18

“用源代码来解决问题,卢克!”...;-). 研究一下 这个链接,你会很快明白的;-).

当没有设置种子时会发生什么(也就是“i 是 None”的情况):

if a is None:
    try:
        a = long(_hexlify(_urandom(16)), 16)
    except NotImplementedError:
        import time
        a = long(time.time() * 256) # use fractional seconds

还有 expovariate:

random = self.random
u = random()
while u <= 1e-7:
    u = random()
return -_log(u)/lambd

显然,它和其他方法使用的是同一个随机数生成器,所以受到种子设置与否的影响是一样的(真的,难道还有其他方法吗?-)

撰写回答