Чи "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 Його причина, здається, "тому, що математика".
еш

22
@eshs: Цікавий факт: Сторінка 283 вашого посилання показує inextp = 31;, але вихідний код Randomкласу має це так, inextp = 21;тому що хтось неправильно вводив його, викликаючи цю помилку .
Джессі Добрий

7
@Izkata Нам потрібно навчити користувачів правильній поведінці (не голосувати, щоб закрити помилково) на довгострокову мету якості сайту, а не просто націлювати на короткотермінову мету (не закривати конкретне питання). І якби я не зазначив вищезазначених коментарів, він може закритись як дублікат, тому що люди це роблять іноді.
Бернхард Баркер

Відповіді:


141

Ні, але це засноване на Phi ("золоте співвідношення").

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

Більше про золоте співвідношення тут .

І справді гарне прочитання для випадкового математика тут .

І я знайшов дослідницький документ про генератори випадкових чисел, який згоден з цим твердженням. (Див. Стор. 53.)


17
Чи знаєте ви, чому число, засноване на Phi, робить хороший вибір насінням? Чи можна було б це підсумувати тут?
Бернхард Баркер

29
@Dukeling Константа використовується рівно один раз, щоб загартувати насіння. Я дуже сильно підозрюю, що це було вибрано як номер, що не відповідає моєму рукаву, що не дозволяє насінням з декількома бітами встановити (можливо, звичайний вибір) викручувати генератор випадкових чисел (замість якоїсь магічної властивості фі).
Девід Ейзенстат

7
Напрошуючи цитату із зазначеної книги За словами Knuth, будь-який великий 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."
цифрами

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

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).

Існує кілька реалізацій цього генератора. Кнут пропонує свою реалізацію у FORTRAN у своїй книзі. Я знайшов такий код із таким коментарем:

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

Згідно з Кнутом, будь-який великий MBIG та будь-який менший (але все ж великий) MSEED може бути заміщений вищезазначеними значеннями.

Трохи більше можна знайти тут. Зауважте, що це насправді не дослідницький документ (як заявляв Math), це лише магістерська робота.

Люди в криптографії як використовувати ірраціональне число ( pi, e, sqrt(5)) , тому що є гіпотеза , що цифри таких чисел з'являються з однаковою частотою , і таким чином мають високу ентропію . Ви можете знайти це пов’язане запитання на сторінці безпеки stackexchange, щоб дізнатися більше про такі цифри. Ось цитата:

"Якщо константи будуть обрані навмання, то з великою часткою ймовірності жоден зловмисник не зможе її зламати". Але криптографи, будучи параноїдальним партією, скептично ставляться, коли хтось каже: "Давайте використаємо цей набір констант. Я їх вибрав навмання, клянусь ". Тому в якості компромісу вони використовуватимуть константи, як, скажімо, бінарне розширення π. Хоча ми більше не маємо математичної вигоди від того, що вибрали їх навмання з якогось великого набору чисел, ми можемо принаймні бути впевненішими, що не було диверсій.


5
Що стосується анссер, то це не лише через їх ентропію, а й тому, що ці цифри подвоюються, як ніщо, що перевищує мої рукави .
Коул Джонсон
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.