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


162

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

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

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

private const int MSEED = 161803398; 

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

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

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



6
@ 48klocs: так сказано в документах :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.
Джесси Гуд

4
@ 48klocs Да, страница 283 здесь: apps.nrbook.com/c/index.html Его причина, кажется, «потому что математика».
eshs

22
@eshs: Интересный факт: страница вашей ссылки показывает inextp = 31;, но в исходном коде Randomкласса она есть, inextp = 21;потому что кто-то опечатал ее, вызвав эту ошибку .
Джесси Гуд

7
@Izkata Мы должны обучать пользователей правильному поведению (не голосовать за закрытие по ошибке) для долгосрочной цели качества сайта, а не просто для достижения краткосрочной цели (не закрывая конкретный вопрос). И если бы я не указал вышеупомянутые комментарии, он мог бы быть закрыт как дубликат, потому что люди иногда делают это.
Бернхард Баркер

Ответы:


141

Нет, но это основано на Фи («золотое сечение»).

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

Подробнее о золотом сечении здесь .

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

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


17
Знаете ли вы, почему число, основанное на Фи, делает хороший выбор в качестве семени? Можно ли обобщить это здесь?
Бернхард Баркер

29
@Dukeling Константа используется ровно один раз, чтобы умерить поступающее семя. Я очень сильно подозреваю, что это было выбрано как « ничто по сравнению с моим номером рукава», которое не позволяет семенам с несколькими установленными битами (возможно, обычным выбором) испортить генератор случайных чисел (вместо какого-то магического свойства фи).
Дэвид Эйзенстат

7
Цитировать цитату из упомянутой книги Согласно Кнуту, любой большой MBIG и любой меньший (но все еще большой) MSEED могут быть заменены вышеуказанными значениями. Так что это математическое веселье, более или менее .. Поэтому правильный ответ должен быть: Нет. Но он основан на Фи.
TaW

14
Просто взглянул на эту бумагу случайных чисел - эта строка немного выделялась - "One can’t even fathom the repercussions if security flaws in the implementation (or design) of the SSL protocol are to be found."(стр. 4)
jcw

2
Я думаю, что более подходящим способом использования золотого сечения было бы использование (модуль / фи), а не использование представления 10 цифр в коде, которое не имеет ничего общего с базой 10. Интересная характеристика фи, которая Я не видел на этой странице, что из того, что я могу сказать, для любого целого числа N значение N / phi-int (N / phi)> = 1 / N / sqrt (5). Это будет означать, что даже если генерируется последовательность чисел N / phi-int (N / phi), расстояние между ближайшей парой будет в пределах множителя sqrt (5) от максимально возможного равномерного расстояния в интервале ( 0..1)
суперкат

62

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

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

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

Генератор основан на следующей рекурсии: 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).

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

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

Согласно Кнуту, любой большой MBIG и любой меньший (но все еще большой) MSEED могут быть заменены вышеуказанными значениями.

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

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

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


5
Что касается ответа, то это не только из-за их энтропии, но и потому, что эти числа удваиваются, как ничто в моих числах на рукавах .
Коул Джонсон
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.