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