random.randint 在 Python 2.x 和 Python 3.x 中显示了具有相同种子的不同输出



我正在将应用程序从python 2移植到python 3,遇到了以下问题:random.randint根据使用的Python版本返回不同的结果。所以

import random
random.seed(1)
result = random.randint(1, 100)

在 Python 2.x 上的结果将是 14,在 Python 3.x 上:18

不幸的是,我需要在 python3 上具有相同的输出才能使服务向后兼容。

现在我只有使用Python 3.x subprocess模块来执行Python 2.x代码的工作想法

result = subprocess.check_output(
    '''python2 -c "import random; random.seed('%s'); print(random.randint(1, 100))"''' % seed,
    shell=True
 )

但是这种方法比仅执行 random.randint(1, 100) 慢约 1000 倍。

也许还有其他方法可以做到这一点?

差异是由两件事引起的:

  1. 您应该使用random.seed(42, version=1)
  2. 在python 3.2中,random.randrange有一个变化,由random.randint调用,可能会增加上述问题。

因此,请使用以下内容:

try: random.seed(42, version=1)  # Python 3
except TypeError: random.seed(42)  # Python 2

int(1+random.random()*99).

更多详情

随着randrange的变化,向后兼容性被故意丢弃,请参阅原始问题。

请参阅此reddit帖子。

如果可能的话,在reddit帖子中建议使用类似numpy.random

使用文档中描述的random.seed(42, version=1)将导致random.random()提供相同的结果,但为random.randint(1,100)提供不同的结果(因为在python 3.2中,旧实现的一些问题已得到修复(。您可以选择仅依赖类似 int(1+random.random()*99) .

(Python 2 将很快耗尽支持,很快 2 或在这里。如果可能,请检查是否确实需要向后兼容性。

我目前的测试:

import random 
try: random.seed(42, version=1)  # Python 3
except TypeError: random.seed(42)  # Python 2
print(random.random())
print(int(1+99*random.random()))
print(random.randint(1,99))

蟒蛇 2 的结果

0.639426798458
3
28

和蟒蛇 3

0.6394267984578837
3
36

终于找到了答案!

Sparky05给出了有趣的想法,靠近int(1+99*random.random())

但正确的答案是

random.seed(seed, version=1)
int(random.random() * 100) + 1

在 Python 3.x 中

工作方式相同,例如

random.seed(seed)
random.randint(1, 100)

在 Python 2.x 中

您可以指定用于种子的版本:random.seed(1, version=1) 。但是,正如Sparky05所述,您可能最好使用numpy.random

模拟random.seed(a=None)random.randint(a, b)的函数,用于python 3python 2

import random

def seed(a=None):
    try:  # Python3
        random.seed(a, version=1)
    except TypeError:  # Python2
        random.seed(a)

def randint(a, b):
    return int(random.random() * (b - a + 1)) + a

用:

seed(1)
result = randint(1, 100)

最新更新