воскресенье, 3 марта 2013 г.

Проверка Random.seed()

   Если верить встроенной документации модуля 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 просто потрясает воображение. )

Комментариев нет:

Отправить комментарий