Я пытался регистрировать вызовы random()
, помещая вокруг него оболочку для печати. К своему удивлению я заметил, что начал получать разные случайные значения. Я создал небольшой пример, демонстрирующий поведение:
Script main.py:
import random
def not_wrapped(seed):
""" not wrapped """
gen = random.Random()
gen.seed(seed)
# def wrappy(func):
# return lambda: func()
# gen.random = wrappy(gen.random)
gen.randint(1, 1)
return gen.getstate()
def wrapped(seed):
""" wrapped """
gen = random.Random()
gen.seed(seed)
def wrappy(func):
return lambda: func()
gen.random = wrappy(gen.random)
gen.randint(1, 1)
return gen.getstate()
for s in range(20):
print(s, not_wrapped(s) == wrapped(s))
Вывод python3.7.5 main.py
(то же, что python 3.6.9)
0 True
1 False
2 False
3 False
4 False
5 True
6 False
7 False
8 False
9 False
10 True
11 False
12 False
13 False
14 False
15 True
16 False
17 True
18 False
19 True
Итак, как вы видите, состояние экземпляра Random gen
отличается и зависит от того, оборачиваю ли я gen.random в wrappy
или нет.
Если я вызываю randint()
дважды тест не пройден для всех семян 0-19. Для Python 2.7.17 функции wrapped
и not_wrapped
каждый раз возвращают одно и то же случайное значение (выводит True для каждого начального числа).
Кто-нибудь знает, что происходит?
Python 3.6 онлайн-пример: http://tpcg.io/inbKc8hK
На Python 3.8.2 в этом онлайн-ответе проблема не не показывает: https://repl.it/@DavidMoberg / ExemplaryTeemingDos
(Этот вопрос был размещен по адресу: https://www.reddit.com/r/learnpython/comments/i597at/is_there_a_bug_in_randomrandom/)