Ничего себе - это - интересное обсуждение. Мои собственные мысли на этом:
FP делает некоторые задачи относительно простыми (по сравнению с языками ни-одного-FP). Языки ни-одного-FP уже начинают брать идеи от FP, таким образом, я подозреваю, что эта тенденция продолжится, и мы будем видеть больше слияния, которое должно помочь людям сделать прыжок к FP легче.
Некоторые ранние взломы безопасности Netscape были сосредоточены на знании того, когда был отправлен зашифрованный пакет, и сужении возможного диапазона начальных значений с помощью этого знания. Так, получение счетчика тиков или чего-то еще, даже отдаленно детерминированного - не лучший вариант.
Даже при использовании начального числа последовательность «случайных» чисел детерминирована на основе этого начального числа. Исследователь Игровой комиссии Невады понял это в отношении определенных слотов, которые он должен был проверить, и использовал эти знания, чтобы заработать немало денег, прежде чем его поймают.
Если вам нужна случайность мирового класса, вы можете добавить в свою систему оборудование, которое обеспечивает для очень рандомизированного числа. Вот как это делают известные покерные сайты (по крайней мере, так они говорят).
Если не считать этого, объедините ряд факторов вашей системы, которые все изменяются независимо и быстро, с минимальной предсказуемостью, чтобы создать очень достойное семя. Ответ на связанный пост на SO предложил использовать Guid.NewGuid (). GetHashCode (). генератор показывает, что, поскольку последовательность GUID V4 псевдослучайна, учитывая начальное состояние, можно прогнозировать до следующих 250 000 GUID возвращенный функцией UuidCreate [2]. Вот почему GUID не следует использовать в криптографии, например, как случайные ключи.
В системах unix вы можете взять несколько байтов из / dev / random в качестве начального числа для вашего ГСЧ. / dev / random должен быть очень хорошим случайным, используя различные источники энтропии, доступные на ПК. Конечно, это полностью зависит от реализации.
Один из случаев, когда это может быть полезно, - это криптографические приложения, поскольку время (0) относительно легко угадать.
Слишком долго для комментария, но интересная история о 32-битных начальных числах на заре онлайн-покера.
Алгоритм тасования, используемый в Программное обеспечение ASF всегда начинается с заказанная колода карт, а затем генерирует последовательность случайных чисел используется для изменения порядка колоды. В реальном колода карт, их 52! (~ 2 ^ 226) возможны уникальные тасования. Напомним, что начальное число для 32-битного случайного числа генератор должен быть 32-битным числом, это означает, что их чуть более 4 миллиард возможных семян. Поскольку колода повторно инициализируется, и генератор повторно заполняется перед каждой перетасовкой, только 4 миллиард возможных перетасовок может привести из этого алгоритма. 4B возможно shuffles тревожно меньше 52!.
Инструмент, разработанный RST для использования этого уязвимость требует пяти карт от колода будет известна. На основе пять известных карт, программа ищет через несколько сотен тысяч возможные перетасовки и выводы, которые один идеально подходит. На случай, если Texas Hold 'em Poker, это означает программа принимает на вход две карты что обманщику раздали, плюс первые три общие карты которые сдаются в открытую (флоп). Эти пять карт известны после первый из четырех раундов торговли, и достаточно для определения (в реальном времени, во время игры) точное перемешивание.
Вам понадобится альтернативный / вторичный источник энтропии. В зависимости от того, сколько энтропии вы хотите использовать, вы можете вычислить хэш любого из следующих входных данных и использовать его в качестве начального числа для вашего окончательного генератора:
CryptGenRandom
, чтобы получить буфер криптографически случайных байтов / dev / random
В unix попробуйте читать из / dev / random. Чтение с этого устройства происходит медленно, поэтому не делайте этого слишком часто - например, только для установки начального числа. Случайное устройство получает данные из энтропии, сгенерированной оборудованием (шума окружающей среды от устройств), и в течение заданного периода времени их не может быть бесконечного количества. Если у вас закончится энтропия, библиотеки SSL могут выйти из строя. Через некоторое время энтропия восполняется (на самом деле это бассейн энтропии). Также существует urandom afaik, который более экономичен, но менее случайен и не блокируется в условиях низкой энтропии.
Через некоторое время энтропия восполняется (на самом деле это бассейн энтропии). Также существует urandom afaik, который более экономичен, но менее случайен и не блокируется в условиях низкой энтропии. Через некоторое время энтропия восполняется (на самом деле это бассейн энтропии). Также существует urandom afaik, который более экономичен, но менее случайен и не блокируется в условиях низкой энтропии.Существует веб-служба, которая предлагает бесплатные и платные "истинные" случайные биты, генерируемые из атмосферного шума: http://www.random.org/
Wired опубликовал статью о двух парнях, которые использовали в основном шум от ПЗС-чипа веб-камеры для генерации случайных чисел: http://www.wired.com/wired/archive/11.08/random.html
Использование tickCout () или чего-либо с высокой частотой - плохая идея. Это связано с тем, что сошник очень быстро возвращается к нулю, что дает возможность получить такое же семя.
time(NULL): Repeats every 64 years.
tickCouter() Repeats every X days.
Вы можете попытаться получить какое-нибудь случайное значение от природы.
Молния ударяет по всему миру в последнюю секунду (очевидно, что это онлайн)? (Возможно, вам придется провести исследование, чтобы увидеть, является ли это переменным).
Вы можете сохранить случайное начальное число при выходе из программы и загрузить его при запуске, поэтому вам нужно будет инициализировать свой ГСЧ со временем (0) только при первом запуске программы.
Использование (только) времени в качестве начального числа ГПСЧ имеет в основном две проблемы:
Для первой проблемы обычно необходимо, чтобы вы взяли столько источников энтропии, сколько сможете.
Что касается второй проблемы, статья Общие дефекты инициализации генераторов псевдослучайных чисел Макото Мацумото может дать некоторое представление.
Метод с генераторами случайных чисел состоит в том, чтобы засеять его только один раз, поэтому ваш пример онлайн-игры не будет проблемой, поскольку потенциально один и тот же rng будет использоваться для каждого значения, которое было бы засеяно при первом запуске программы (возможно, несколько лет назад).
Поскольку вы уже используете boost, вам, вероятно, понадобится boost :: random_device .
(По крайней мере, в Linux. Я не помню, доступна ли еще очевидная реализация CryptGenRandom в Windows.)