Оригінальне джерело випадкового алгоритму `(насіння * 9301 + 49297)% 233280?


9

Якщо ви шукаєте приклади створення насінного генератора випадкових чисел, ви наткнетеся на такі речі (конкретний приклад http://indiegamr.com/generate-repeatable-random-numbers-in-js/ ):

// the initial seed
Math.seed = 6;

// in order to work 'Math.seed' must NOT be undefined,
// so in any case, you HAVE to provide a Math.seed
Math.seededRandom = function(max, min) {
    max = max || 1;
    min = min || 0;

    Math.seed = (Math.seed * 9301 + 49297) % 233280;
    var rnd = Math.seed / 233280;

    return min + rnd * (max - min);
}

Ці конкретні числа (9301, 49297, 233280) та алгоритм використовуються знову і знову, але, здається, ніхто не має остаточного посилання на це. Хто винайшов цей алгоритм і протестував розподіл? Чи є папір чи щось цитувати?


5
це лінійний конгруентний генератор, але з досить невеликим періодом (всього 233 к, а 32-бітний інт дозволяє мати 4 мільярди періоду
храповик виродка

1
Люди часто копіюють код безпосередньо з книг, тому, ймовірно, зі старої книги десь і копіювались кілька разів. Це також видається обмежувальним випадком. Можливо, корисно: heydari.persiangig.com/Ebooks/Applied_Crypto-Ch11-ch20.pdf/… ict.griffith.edu.au/anthony/info/C/RandomNumbers
barrycarter

2
Незалежно від походження, це жахливі значення, які слід використовувати для обчислення насіння.

3
@jlarson коментар недостатньо довгий, але є два питання. По-перше, як нагадали на уроки храповиків, модуль - це максимальний період: кількість унікальних чисел до того, як генератор повториться. Фактичний період може бути меншим. По-друге, два інші числа (в основному множинні) повинні бути відносно простими до числа модулів, щоб забезпечити більш тривалий період. В ідеалі число модулів є найбільшим простим числом, ніж максимальне додатне ціле число, яке вписується в тип даних, а два інші числа також є великими простими числами.

1
Це коротка, коротка версія того, чому ці цифри жахливі, враховуючи, що це побічна дискусія, і додавання фактичної відповіді не підходить для цього питання. Я рекомендую підстрибувати навколо Вікіпедії та, можливо, математики чи інформатики для отримання додаткової інформації, хоча технічно псевдовипадкові алгоритми чисел також є темою у програмістів.

Відповіді:


7

Швидкий пошук Google Книг показує, що ці цифри (9301, 49297, 233280) були використані в ряді посилань:

  • Числові рецепти в FORTRAN 77
  • Вступ до числових методів у С ++
  • Ресурс розробника CGI: Веб-програмування в TCL та PERL
  • Ефективний Fortran 77 для інженерів та вчених
  • Розробка JavaScript
  • Усі на С
  • Приклади Java в двох словах
  • Наборові алгоритми
  • Вступ до механіки

Найдавніший - це комп'ютерні методи математичних обчислень Джорджа Елмера Форсайта, Майкла А. Малкольма, Кліва Б. Молера (Prentice-Hall) 1977 року , хоча Google не показує, де текст використовувався в книзі, тому його неможливо перевірити.

Найбільш раннім, що показує текст, є Числові рецепти на Паскалі (Перше видання): Мистецтво наукових обчислень , Том 1 пресою, Теукольським, Веттерлінг та Фланнері в таблиці на повній сторінці «Константи портативних генераторів випадкових чисел». Ці конкретні числа задаються при переливі в 2 ^ 31.

Серія книг « Числові рецепти » користується величезною популярністю і друкується з 1986 року.


1
Нічого собі, якщо відповіді немає тут, я не знаю, де це було б. Дякую .. // Я сподівався, що зможу вказати на якісь конкретні дослідження щодо того, чому ці числа є особливими, але цього достатньо. 9301 - це продукт двох праймів (71x131), 49297 - це першочергове - інстинктивно я вважаю, що це має бути актуальним. 233280 не є простим - він дорівнює 2x2x2x2x2x2x3x3x3x3x3x3x5 (або 2 ^ 6 * 3 ^ 5 * 5)
jlarson
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.