Является ли 161803398 "Специальным" номером? Внутри Math.Random()

Я подозреваю, что ответ " Из-за математики", но я надеялся, что кто-то может дать немного больше понимания на базовом уровне...

В сегодняшнем исходном коде BCL я думал, что некоторые из классов, которые я использовал ранее, действительно были реализованы. Я никогда не думал о том, как создавать (псевдо) случайные числа раньше, поэтому я решил посмотреть, как это было сделано.

Полный исходный код здесь: http://referencesource.microsoft.com/#mscorlib/system/random.cs#29

private const int MSEED = 161803398; 

Это значение MSEED используется каждый раз, когда вы выбираете класс Random().

Во всяком случае, я видел это "магическое число" - 161803398 - и у меня нет туманной идеи о том, почему это число было выбрано. Это не простое число или сила 2. Это не "половина пути" к числу, которое показалось более значительным. Я смотрел на него в двоичном и шестнадцатеричном виде, и это выглядело как номер для меня.

Я попытался найти номер в Google, но ничего не нашел.

Ответ 1

Нет, но он основан на Phi ( "золотое соотношение" ).

161803398 = 1.61803398 * 10^8 ≈ φ * 10^8

Подробнее о золотом коэффициенте здесь.

И действительно хороший читать для случайного математика здесь.

И я нашел исследовательскую статью о генераторах случайных чисел, которая согласуется с этим утверждением. (См. Стр. 53.)

Ответ 2

Это число взято из золотой коэффициент 1.61803398 * 10 ^ 8. Мэтт дал хороший ответ, что это за число, поэтому я просто немного объясню об алгоритме.

Это не является специальным номером для этого алгоритма. Алгоритм Knuth subtractive алгоритм генератора случайных чисел, и основными его пунктами являются:

  • хранит список из 56 случайных чисел
  • инициализация - это процесс заполнения списка, а затем рандомизация этих значений с помощью определенного детерминированного алгоритма
  • сохраняются два индекса, длина которых равна 31.
  • новое случайное число - это разность двух значений по двум индексам
  • сохранить новое случайное число в списке

Генератор основан на следующей рекурсии: X n= (X n-55 - X n-24)) mod m, где n & geq; 0. Это частный случай отстающий генератор Фибоначчи: X n= (X nj @X nk) mod m, где 0 < k < j и @- любая двоичная операция (вычитание, сложение, xor).

Существует несколько реализаций этого генератора. Кнут предлагает реализацию в Фортран в своей книге. Я нашел следующий код со следующим комментарием:

ПАРАМЕТР (MBIG = 1000000000, MSEED = 161803398, MZ = 0, FAC = 1.E-9)

По к Кнуту, любой большой MBIG и любой меньший (но все же большой) MSEED может заменить эти значения.

Немного больше можно найти здесь Обратите внимание, что это на самом деле не исследовательская работа (как указано в Math), это просто диплом магистра.

Люди в криптографии любят использовать иррациональное число (pi, e, sqrt(5)), потому что есть гипотеза о том, что цифры такие числа появляется с равной частотой и, следовательно, имеет высокий entropy. Этот связанный с этим вопрос можно найти в security stackexchange, чтобы узнать больше о таких числах. Вот цитата:

"Если константы выбираются случайным образом, то с большой вероятностью нет атакующий сможет его разбить". Но криптографы, будучи параноидальные партии, скептически относятся, когда кто-то говорит: "Позвольте использовать этот набор константы. Я выбрал их наугад, я клянусь. Итак, как компромисс, они будут использовать константы, например, двоичное разложение π. В то время как мы больше не имеют математической выгоды от выбора их в случайный из некоторого большого пула чисел, мы можем по крайней мере быть более уверен, что саботаж не был.