18

a)在这种情况下,随机数生成器是否在每次运行时使用系统时钟(改变种子)?

b) 种子是否用于生成 expovariate(lambda) 的伪随机值?

4

3 回答 3

17

“使用源头,卢克!”...;-)。学习https://svn.python.org/projects/python/trunk/Lib/random.py会很快让你放心;-)。

未设置种子时会发生什么(即“i is 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

显然使用与其他所有方法相同的底层随机生成器,因此同样受到播种或缺乏播种的影响(真的,它会怎么做?-)

于 2009-05-03T19:04:15.867 回答
6

a) 它通常使用系统时钟,某些系统上的时钟可能只有 ms 精度,因此种子两次非常快可能会产生相同的值。

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 可以,但我找不到任何证据。如果没有,那就太傻了。

于 2009-05-03T18:51:43.870 回答
2

使用当前系统时间;当前系统时间也用于在模块首次导入时初始化生成器。如果操作系统提供随机源,则使用它们而不是系统时间(有关可用性的详细信息,请参见 os.urandom() 函数)。

随机文件

于 2009-05-03T18:52:06.833 回答