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

chi*_*kiy 9 python

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

import random
random.seed(1)
result = random.randint(1, 100)
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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

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

Spa*_*y05 8

差异是由两件事引起的:

  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
Run Code Online (Sandbox Code Playgroud)

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

更多详情

向后兼容性是随更改而故意删除的randrange,请参阅原始问题

看到这个reddit帖子。

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

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))
Run Code Online (Sandbox Code Playgroud)

Python 2上的结果

0.639426798458
3
28
Run Code Online (Sandbox Code Playgroud)

和Python 3

0.6394267984578837
3
36
Run Code Online (Sandbox Code Playgroud)


chi*_*kiy 3

终于找到答案了!

Sparky05 给出了有趣的想法并且接近int(1+99*random.random())

但正确答案是

random.seed(seed, version=1)
int(random.random() * 100) + 1
Run Code Online (Sandbox Code Playgroud)

在Python 3.x中

工作方式与

random.seed(seed)
random.randint(1, 100)
Run Code Online (Sandbox Code Playgroud)

在Python 2.x中