Я пишу программу, совместимую как с Python 2.7, так и с 3.5. Некоторые его части полагаются на случайный процесс. В моих модульных тестах используется произвольное семя, что приводит к одинаковым результатам во всех исполнениях и языках ... кроме кода с использованием random.shuffle
.Разница между Python 2 и 3 для тасования с заданным семенем
Пример в 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?
Кроме того, быстрый взгляд на [реализация Py2] (https://svn.python.org/projects/python/tags/r27/Lib/random.py) и [реализация Py3] (https: //svn.python .org/projects/python/tags/r32/Lib/random.py) показывает, что существует несколько реализаций тасования (хотя они могут быть эквивалентными - я бы ожидал, что для этого должны быть unittests, когда была введена модификация). –
Попробуйте '' 'random.seed (42, version = 1)' '' (или, может быть, version = 2, но установите этот аргумент), как описано [здесь] (https://docs.python.org/3/library/ random.html # random.seed). – sascha
'[random.random() for _ in range (20)]' возвращает одинаковые результаты в обеих версиях - похоже, это изменение реализации в 'random.shuffle' ... –