Случайный модуль Jython дает разные результаты для cpython - PullRequest
3 голосов
/ 04 ноября 2011

Я генерирую некоторые тестовые данные с использованием известного случайного начального числа. Я хочу использовать эти данные из cpython и из Jython. Я обнаружил, что данные отличаются, если я использую jython (2.5.2) против cpython.

Сводя его к простому тесту, я вижу, что PRNG дает разные результаты в двух реализациях:

В Jython:

Jython 2.5.2 (Release_2_5_2:7206, Mar 2 2011, 23:12:06) 
[Java HotSpot(TM) Server VM (Sun Microsystems Inc.)] on java1.6.0_26
Type "help", "copyright", "credits" or "license" for more information.
>>> import random
>>> random.seed(1)
>>> random.random()
0.7308781974052877

В CPython:

Python 2.7.2+ (default, Oct  4 2011, 20:03:08) 
[GCC 4.6.1] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import random
>>> random.seed(1)
>>> random.random()
0.13436424411240122

Тестовые данные, которые я генерирую, воспроизводятся в каждой реализации Python. Это можно обойти? Может мне нужно написать свой собственный PRNG?

Ответы [ 2 ]

6 голосов
/ 04 ноября 2011

Есть способ обойти это.Обе реализации включают в себя чистый питон "WichmannHill" PRNG.Это медленнее, но дает одинаковые результаты как в Jython, так и в CPython.

В своем коде я заменил

random.seed(1)
uuid += random.choice(hexdigits)

на

rand = random.WichmannHill(1)
uuid += rand.choice(hexdigits)
3 голосов
/ 04 ноября 2011

Как сказал Делнан в комментарии: не удивительно, что разные интерпретаторы python генерируют разные случайные последовательности. Официальная документация относится к реализации C-алгоритма. Другие реализации Python могут выбирать другие алгоритмы. Фактически, наименьшим общим знаменателем может быть распределение произведенных случайных последовательностей.

Если вы зависите от псевдослучайных последовательностей, которые могут быть воспроизведены всеми интерпретаторами Python, вы должны написать свой собственный генератор псевдослучайных чисел. регистр сдвига с линейной обратной связью может быть хорошим началом и относительно прост для понимания.

...