Баг в Питоновском random.jumpahead
Отлаженную функцию, не замечая, что с ней что-то не то, за семь лет её существования!
питон? научных?
Кстати, если кому интересно — если выводить побольше строк и символов, то можно видеть как изменения расползаются по внутреннему состоянию довольно причудливым образом, и, кажется, полностью его перемешивают после 624 итераций (какое совпадение! то есть jumpahead(1000 * i) уже должен наверное работать правильно.
ну или какой-нить нормальный который писали и проверяли специальные случайно выбранные люди.
кстати а есть какой-нить стандартный способ проверить генератор? чтоб такую хрень ловить автоматом.
.
Upd: Хотя это частный случай.
Лучше .
Потому что либковский сосёт, ядерный /dev/random тоже сосёт и тормозит, а /dev/urandom тормозит вообще ужасно.
Плюс хочется возможность задавать seed, сохранять и восстанавливать состояние етс.
ну или какой-нить нормальный который писали и проверяли специальные случайно выбранные люди.
Ну, они и используют нормальный, который писали и проверяли специальные люди.
С самим генератором-то всё нормально. Проблема в приделанной к нему условно полезной функции (которую видимо мало кто импользует, и которую кстати убрали совсем в 3.x).
Тут можно было бы вывести мораль насчёт общих качеств случайных чисел и криптования, где никакой супернадёжный core алгоритм не спасёт от написанния кем-нибудь утилитки наспех, без приличествующих случаю предварительных размышлений о природе вещей. В дотнете даже кажется была совершенно замечательная фишка, когда поточный шифрователь по дефолту работал в режиме независимого шифрования блоков (по 16 байт типа со всеми вытекающими — что их можно было дублировать и переставлять местами, узнавать интересные вещи при помощи паддинга (если есть какой-то контроль над шифруемыми данными типа кукизов) и вообще всё ломать! Невзирая на то, что внутри там был правильный олгоритм и всё такое.
ну типа разве кроссплатформенной зависимости от сида хотеть — плохая вещь?
Оставить комментарий
bleyman
random.jumpahead(n)Change the internal state to one different from and likely far away from the current state. n is a non-negative integer which is used to scramble the current state vector. This is most useful in multi-threaded programs, in conjunction with multiple instances of the Random class: setstate or seed can be used to force all instances into the same internal state, and then jumpahead can be used to force the instances’ states far apart.
New in version 2.1.
Changed in version 2.3: Instead of jumping to a specific state, n steps ahead, jumpahead(n) jumps to another state likely to be separated by many steps.
from random import Random
for i in range(40):
rnd = Random(0)
rnd.jumpahead(i)
print ''.join(str(rnd.randint(0, 9 for _ in range(60
code:771847894721109866610194534615350890979658376172715087844223
071847894721109866610194534615350890979658376172715087844223
971847894721109866610194534615350890979658376172715087844223
031847894721109866610194534615350890979658376172715087844223
294847894721109866610194534615350890979658376172715087844223
430847894721109866610194534615350890979658376172715087844223
716847894721109866610194534615350890979658376172715087844223
711747894721109866610194534615350890979658376172715087844223
011427894721109866610194534615350890979658376172715087844223
205727894721109866610194534615350890979658376172715087844223
211757894721109866610194534615350890979658376172715087844223
230020894721109866610194534615350890979658376172715087844223
000227594721109866610194534615350890979658376172715087844223
230690794721109866610194534615350890979658376172715087844223
530494464721109866610194534615350890979658376172715087844223
533528774721109866610194534615350890979658376172715087844223
837548704721109866610194534615350890979658376172715087844223
309514167721109866610194534615350890979658376172715087844223
287823074521109866610194534615350890979658376172715087844223
287553748821109866610194534615350890979658376172715087844223
483552547441109866610194534615350890979658376172715087844223
203550570821109866610194534615350890979658376172715087844223
298954790654109866610194534615350890979658376172715087844223
296952897025109866610194534615350890979658376172715087844223
110652575022309866610194534615350890979658376172715087844223
120672265685209866610194534615350890979658376172715087844223
260672077599509866610194534615350890979658376172715087844223
360932818523209866610194534615350890979658376172715087844223
113872847842266866610194534615350890979658376172715087844223
333172893949803866610194534615350890979658376172715087844223
601890871817938866610194534615350890979658376172715087844223
893792828318273866610194534615350890979658376172715087844223
244272821225481386610194534615350890979658376172715087844223
032979825976435926610194534615350890979658376172715087844223
223694827485135598610194534615350890979658376172715087844223
244291821800121230610194534615350890979658376172715087844223
239984821953200126610194534615350890979658376172715087844223
665731821327720661510194534615350890979658376172715087844223
643714621121803653140194534615350890979658376172715087844223
603794221885054628560194534615350890979658376172715087844223
Я проверил — оно уже так как минимум в 2.3.4 (May 27th, 2004). А пофиксили её только в 2.7.1 совсем недавно (вот багрепорт: , суть токова: у них там Mersenne Twister, у которого внутреннее состояние состоит из 624 интов, по которым он ползает и перелопачивает их, выдавая псевдослучайные биты. Ну вот они думали, что если изменить что-нибудь в начале, то изменения сразу же расползутся. А хуй!)
Интересно, сколько Научных Исследований например поиспользовало эту Надёжную и Отлаженную функцию, не замечая, что с ней что-то не то, за семь лет её существования!