python随机数生成中的意外行为

2024-04-25 13:50:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下代码:

import random

rand1 = random.Random()
rand2 = random.Random()

rand1.seed(0)
rand2.seed(0)

rand1.jumpahead(1)
rand2.jumpahead(2)

x = [rand1.random() for _ in range(0,5)]
y = [rand2.random() for _ in range(0,5)]

根据jumpahead()函数的文档,我期望x和{}是(伪)独立的序列。但我得到的结果是:

^{pr2}$

如果你注意到了,第2-5个数字是一样的。每次运行代码时都会发生这种情况。在

我是不是少了点什么?在


Tags: 函数代码in文档importforrange序列
2条回答
rand1.seed(0)
rand2.seed(0)

用相同的值初始化它们,这样就得到了相同的(非)随机性。使用一些值(如当前的unix时间戳)为其设定种子,您将获得更好的值。但是请注意,如果你用当前时间同时初始化两个RNG,你当然会从中得到相同的“随机”值。在

更新:刚刚注意到jumpahead()的东西:看看How should I use random.jumpahead in Python-它似乎回答了你的问题。在

我认为有一个bug,python的文档并没有把这一点弄清楚。在

jumpahead的两个参数之间的差异是1,这意味着你只能保证得到1个唯一的值(这就是发生的情况)。如果需要更多值,则需要更大的参数。在

编辑:进一步说明

最初,顾名思义,jumpahead只是在序列中跳到前面。很明显,在这种情况下,在序列中向前跳1或2个位置不会产生独立的结果。事实证明,在大多数随机数生成器中向前跳都是低效的。由于这个原因,python只能近似于向前跳跃。因为它是唯一的近似值,python可以实现一个更高效的算法。然而,该方法是“假装”向前跳,传递两个相似的整数不会导致完全不同的序列。在

为了得到不同的序列,你需要传入的整数相距很远。特别是,如果你想读一百万个随机整数,你需要把你的jumpaheads除以一百万。在

最后一点,如果你有两个随机数生成器,你只需要跳上其中一个。你可以(也应该)让另一个保持原来的状态。在

相关问题 更多 >