我正在将应用程序从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 倍。
也许还有其他方法可以做到这一点?
差异是由两件事引起的:
- 您应该使用
random.seed(42, version=1)
- 在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 3
和python 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)