Python的random: 如果不使用种子(someValue)会怎样?
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.
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
显然,它和其他方法使用的是同一个随机数生成器,所以受到种子设置与否的影响是一样的(真的,难道还有其他方法吗?-)