Метод средних квадратов - Middle-square method
В математика, то метод среднего квадрата это метод создания псевдослучайные числа. На практике это не очень хороший метод, поскольку период обычно очень короткий и имеет несколько серьезных недостатков; повторенный достаточное количество раз, метод среднего квадрата либо начнет многократно генерировать одно и то же число, либо перейдет к предыдущему числу в последовательности и будет повторяться бесконечно.
История
По математике
Метод был изобретен Джон фон Нейман, и был описан на конференции в 1949 году.[1]
В своем выступлении 1949 года фон Нейман язвительно заметил: «Любой, кто рассматривает арифметические методы получения случайных чисел, конечно, находится в состоянии греха». Он пояснил, что он имел в виду, что не существует истинных «случайных чисел», только средства их получения, а «строгая арифметическая процедура», такая как метод среднего квадрата, «не является таким методом». Тем не менее он обнаружил, что эти методы в сотни раз быстрее, чем считывание "истинно" случайных чисел с перфокарты, что имело практическое значение для его ENIAC работай. Он обнаружил, что «разрушение» последовательностей в среднем квадрате было фактором в их пользу, потому что его можно было легко обнаружить: «всегда опасаются появления необнаруженных коротких циклов».[1] Николай Метрополис сообщил о последовательности из 750 000 цифр перед «уничтожением» с помощью использования 38-битных чисел методом «среднего квадрата».[2]
Теория первого изобретения
Книга Сломанные кости к Ивар Экеланд дает подробный отчет о том, как этот метод был изобретен монахом-францисканцем, известным только как брат Эдвин, где-то между 1240 и 1250 годами.[3] Предположительно, рукопись сейчас утеряна, но Хорхе Луис Борхес отправил Экеланду копию, которую он сделал в Ватиканской библиотеке.
Метод
Чтобы сгенерировать последовательность n-значных псевдослучайных чисел, создается n-значное начальное значение, которое возводится в квадрат, давая 2n-значное число. Если результат содержит менее 2n цифр, ведущие нули добавляются для компенсации. Средние n цифр результата будут следующим числом в последовательности и будут возвращены как результат. Затем этот процесс повторяется для получения дополнительных чисел.
Значение n должно быть четным, чтобы метод работал - если значение n нечетное, тогда не обязательно будет однозначно определенная «средняя n цифра» для выбора. Примите во внимание следующее: возведение трехзначного числа в квадрат может дать шестизначное число (например, 5402 = 291600). Если бы были средние три цифры, то оставалось бы 6 - 3 = 3 цифры, которые распределялись бы слева и справа от середины. Невозможно равномерно распределить эти цифры по обе стороны от среднего числа, и поэтому нет «средних цифр». Допустимо заполнять начальные числа нулями слева, чтобы получить четное число n (например: 540 → 0540).
Для генератора п-значные числа, период не может быть больше 8п. Если середина п цифры все нули, генератор затем выводит нули навсегда. Если первая половина числа в последовательности нули, последующие числа будут уменьшаться до нуля. Хотя эти пробеги нуля легко обнаружить, они происходят слишком часто, чтобы этот метод имел практическое применение. Метод среднего квадрата также может застрять на числе, отличном от нуля. За п = 4, это происходит со значениями 0100, 2500, 3792 и 7600. Другие начальные значения образуют очень короткие повторяющиеся циклы, например, 0540 → 2916 → 5030 → 3009. Эти явления еще более очевидны, когда п = 2, поскольку ни один из 100 возможных начальных значений не генерирует более 14 итераций без возврата к циклу 0, 10, 50, 60 или 24 ↔ 57.
Пример реализации
Здесь алгоритм представлен в Python 3.
seed_number = int(Вход("Пожалуйста, введите четырехзначное число: п[####] "))номер = seed_numberуже видел = набор()прилавок = 0пока номер нет в уже видел: прилавок += 1 уже видел.Добавить(номер) номер = int(ул(номер * номер).zfill(8)[2:6]) # zfill добавляет заполнение нулями Распечатать(ж"#{прилавок}: {номер}")Распечатать(ж"Мы начали с {seed_number}, и" ж"повторились после {прилавок} шаги " ж" с {номер}.")
Последовательность Вейля в среднем квадрате ГПСЧ
Дефекты, связанные с исходным генератором среднего квадрата, можно исправить, запустив средний квадрат с помощью Последовательность Вейля[4][5]. Последовательность Вейля препятствует сходимости к нулю. Последовательность Вейля также предотвращает проблему повторяющегося цикла, описанную выше. А C реализация показана ниже.
#включают <stdint.h>uint64_t Икс = 0, ш = 0, s = 0xb5ad4eceda1ce2a9;в соответствии статический uint32_t MSWS() { Икс *= Икс; Икс += (ш += s); возвращаться Икс = (Икс>>32) | (Икс<<32);}
Последовательность Вейля (w + = s) добавляется к квадрату Икс. Середина извлекается сдвигом вправо на 32 бита. Этот генератор проходит BigCrush[6][7]. и PractRand[8]. Это может быть самый быстрый ГПСЧ, который проходит все статистические тесты. Доступен бесплатный программный пакет здесь[5].
А счетчик версия этого генератора под названием «квадраты» уже доступна. Видеть arXiv статья "Квадраты: быстрый ГСЧ на основе счетчика"[9][10].
Рекомендации
- ^ а б Статьи 1949 года не переиздавались до 1951 года. Джон фон Нейман, «Различные методы, используемые в связи со случайными числами», в A.S. Хаусхолдер, Г. Форсайт и Х.Х. Жермонд, ред., Метод Монте-Карло, серия Национального бюро стандартов по прикладной математике, т. 12 (Вашингтон, округ Колумбия: Типография правительства США, 1951): стр. 36–38.
- ^ Дональд Э. Кнут, Искусство программирования, Vol. 2, получисленные алгоритмы, 2-е изд. (Ридинг, Массачусетс: Addison-Wesley, 1981), гл. 3, раздел 3.1.
- ^ Ивар Экеланд (15 июня 1996 г.). Разбитые кости и другие математические истории о шансах. Издательство Чикагского университета. ISBN 978-0-226-19992-4.
- ^ Видинский, Бернар (апрель 2017 г.). "Последовательность Вейля в среднем квадрате ГСЧ". arXiv:1704.00358v5.
- ^ а б Веб-сайт ГСЧ последовательности Вейля в среднем квадрате.
- ^ Пьер Л'Экуайер и Ричард Симар (2007) "TestU01: Программная библиотека на ANSI C для эмпирического тестирования генераторов случайных чисел ", Транзакции ACM на математическом ПО, 33: 22.
- ^ Веб-сайт TestU01.
- ^ Крис Доти-Хамфри (2018) "Практически случайно: библиотека C ++ статистических тестов для ГСЧ. "версия 0.94.
- ^ Видинский, Бернар (апрель 2020 г.). «Квадраты: быстрый ГСЧ на основе счетчиков». arXiv:2004.06278v3.
- ^ Сайт Squares RNG.