我将应用程序从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)。
也许还有其他方法可以做到这一点?
差异是由两件事引起的:
random.seed(42, version=1)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)
终于找到答案了!
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中