Если верить встроенной документации модуля random, то с каждым классом Random создаётся новый ГПСПЧ. И в каждом новом процессе новый ГПСПЧ, и т. д. Но вот вопрос: если генераторы цикличны, так можно при выполнении одинакового seed добиться одинаковых результатов?
Правильный ответ - да. Код ниже подтверждает.
Правильный ответ - да. Код ниже подтверждает.
# -*- coding: utf8 -*-
'''
Проверка того, как работает ГПСПЧ.
Создаются 2 класса, одинаково инициализируются, и в цикле
посчитывается число совпадений.
'''
from random import Random
def gener(g1, g2):
for i in xrange(0,20):
print g1.randint(0,20), g2.randint(0,20)
print '============================'
g1=Random()
g2=Random()
g1.seed(a=0)
g2.seed(a=0)
gener(g1, g2)
Вывод обоих генераторов абсолютно одинаковый, так что, имея один ключ для входной и выходной информации - можно xor-ить текст в этих ваших тырнетах - особо не заботясь о результате. ;) Главное, ключ сидирования получить правильный. Для этого существует возможность использовать такую замечательную вещь, как модуль hashlib, который позволит получить, например, sha512 из произвольно набранной фразы, в качестве абсолютно случайной комбинации. Текст sha512 будет не совсем просто передать в виде текстового SMS, можно передать, например, 16 цифр, также набранных на клавиатуре. А это уже 128 бит. Вполне достаточно.
Можно ли сделать так, что сидирование Random приведёт к разным результатам? Дублированный код не привожу, только продолжение:
g1.seed()
g2.seed()
gener(g1, g2)
И полученный результат говорит о том, что генераторы сидированы по разному!
Ну, и на последний вопрос, на который хочу получить ответ - какое предельно большое число подходит в качестве аргумента seed(). На вскидку беру несколько разных чисел:
12345
12786678345
12780986445234234686678345
В последнем случае, длина числа для seed() составляет 26 символов. Генератор Random проглатывает их всех ничтоже сумняшеся. 26 символов - 208 бит. Это прекрасный пароль, по размеру. ))) Я довёл аргумент до 50 цифер, и опять python, имхо, с удовольствием их сожрал.
Что важно, после перезапуска скрипта, генераторы сидированные числом - повторяют свои значения. Генераторы сидированные от внутренних источников энтропии - не повторяются.
Потенциал python просто потрясает воображение. )
Комментариев нет:
Отправить комментарий