Я подозреваю, что ответ « Из-за математики », но я надеялся, что кто-то может дать немного больше понимания на базовом уровне ...
Сегодня я копался в исходном коде BCL и смотрел, как на самом деле реализованы некоторые из классов, которые я использовал ранее. Я никогда раньше не думал о том, как генерировать (псевдо) случайные числа, поэтому я решил посмотреть, как это делается.
Полный источник здесь: http://referencesource.microsoft.com/#mscorlib/system/random.cs#29
private const int MSEED = 161803398;
Это значение MSEED используется каждый раз при заполнении класса Random ().
Во всяком случае, я видел это «магическое число» - 161803398 - и у меня нет ни малейшего представления о том, почему это число было выбрано. Это не простое число или степень 2. Это не «половина пути» к числу, которое казалось более значимым. Я посмотрел на него в двоичном и шестнадцатеричном виде, и, ну, для меня это просто выглядело как число.
Я попытался найти номер в Google, но ничего не нашел.
The current implementation of the Random class is based on Donald E. Knuth's subtractive random number generator algorithm. For more information, see D. E. Knuth. "The Art of Computer Programming, volume 2: Seminumerical Algorithms". Addison-Wesley, Reading, MA, second edition, 1981.
inextp = 31;
, но в исходном кодеRandom
класса она есть,inextp = 21;
потому что кто-то опечатал ее, вызвав эту ошибку .Ответы:
Нет, но это основано на Фи («золотое сечение»).
Подробнее о золотом сечении здесь .
И действительно хорошее чтение для случайного математика здесь .
И я нашел исследовательскую работу по генераторам случайных чисел, которая согласуется с этим утверждением. (См. Стр. 53.)
источник
"One can’t even fathom the repercussions if security flaws in the implementation (or design) of the SSL protocol are to be found."
(стр. 4)Это число взято из золотого сечения 1.61803398 * 10 ^ 8 . Мэтт дал хороший ответ, что это за число, поэтому я просто объясню немного об алгоритме.
Это не специальное число для этого алгоритма. Алгоритм является алгоритмом Кнута, который вычитает генератор случайных чисел, и его основными моментами являются:
Генератор основан на следующей рекурсии: X n = (X n-55 - X n-24 ) mod m, где n ≥ 0. Это частичный случай генератора с запаздыванием Фибоначчи : X n = (X n-j @ X n-k ) mod m, где 0 <k <j и @ - любая двоичная операция (вычитание, сложение, xor).
Есть несколько реализаций этого генератора. Кнут предлагает реализацию в Фортране в своей книге. Я нашел следующий код со следующим комментарием:
Немного больше можно найти здесь. Обратите внимание, что это на самом деле не исследовательская работа (как утверждает Math), это всего лишь дипломная работа.
Люди в криптографии как использовать иррациональное число (
pi
,e
,sqrt(5)
) , потому что есть гипотеза , что цифры таких чисел появляются с одинаковой частотой , и таким образом имеют высокую энтропию . Вы можете найти этот связанный вопрос на бирже безопасности стека, чтобы узнать больше о таких числах. Вот цитата:источник