我正在编写一个与Python2.7和3.5兼容的程序。它的某些部分依赖随机过程。我的单元测试使用了任意的种子,这导致了跨执行和语言的相同结果..。除了使用random.shuffle的代码。
Python 2.7中的示例:
In[]:   import random
        random.seed(42)
        print(random.random())
        l = list(range(20))
        random.shuffle(l)
        print(l)
Out[]:  0.639426798458
        [6, 8, 9, 15, 7, 3, 17, 14, 11, 16, 2, 19, 18, 1, 13, 10, 12, 4, 5, 0]Python 3.5中的相同输入:
In []:  import random
        random.seed(42)
        print(random.random())
        l = list(range(20))
        random.shuffle(l)
        print(l)
Out[]:  0.6394267984578837
        [3, 5, 2, 15, 9, 12, 16, 19, 6, 13, 18, 14, 10, 1, 11, 4, 17, 7, 8, 0]请注意,伪随机数是相同的,但洗牌列表是不同的。正如预期的那样,重新执行单元格不会更改它们各自的输出。
如何为Python的两个版本编写相同的测试代码?
发布于 2019-01-22 13:26:58
如果我错了,可能有人会纠正我,但numpy.random模块似乎不会在python2和3之间更改。
>>> import numpy as np
>>> l = list(range(20))
>>> np.random.RandomState(42).shuffle(l)
>>> l
[0, 17, 15, 1, 8, 5, 11, 3, 18, 16, 13, 2, 9, 19, 4, 12, 7, 10, 14, 6]我在Python2.7(np1.12.1)和3.7 (np1.14.5)中得到了相同的结果。
文档还声明生成了数字版本之间应该是相同的。。
兼容性保证使用相同参数的固定种子和对“RandomState”方法的一系列固定调用将始终产生相同的结果,直到舍入错误,除非值不正确。将修复不正确的值,并在相关的docstring中注明进行修复的NumPy版本。只要以前的行为保持不变,就允许扩展现有的参数范围和添加新的参数。
https://stackoverflow.com/questions/38943038
复制相似问题