Если вы используете LCG для рисования точек в d-мерном пространстве, они будут лежать не более (d! M) 1 / d гиперплоскостей,Это известный недостаток LCG.
Если вы не будете тщательно выбирать a и m (за пределами условия полной периодичности), они могут лежать на гораздо меньшем числе плоскостей, чем эта.Эти числа были выбраны так называемым спектральным тестом .
«Спектральный тест» (название происходит от теории чисел) - это максимальное расстояние между последовательными гиперплоскостями, на которых d-мернаясовместное распределение лжи.Вы хотите, чтобы он был как можно меньшим для максимально возможного количества тестов d.
См. этот документ для исторического обзора по этой теме.Обратите внимание, что указанный вами генератор упоминается в статье (как ANSIC) и определен как не очень хороший.Однако старшие 16 битов приемлемы, но многим приложениям потребуется более 32768 различных значений (как вы указали в комментариях, период действительно равен 2 ^ 31 - условия для полной периодичности в ссылке на Википедию, вероятно, являются только необходимыми).
Первоначальный исходный код в документе ANSI не занимал 16-битные старшие разряды, что приводило к очень плохому генератору, который легко использовать неправильно (rand() % n
- это то, о чем люди сначала думают, чтобы нарисовать число0
и n
, и в этом случае получается что-то очень неслучайное).
См. Также обсуждение LCG в числовых рецептах.Цитата:
Хуже того, многие ранние генераторы сделали особенно плохой выбор для m и a.Одна печально известная такая подпрограмма, RANDU, с = 65539 и m = 231, была широко распространена на мэйнфрейм-компьютерах IBM в течение многих лет и широко копировалась на другие системы.Один из нас, будучи аспирантом, вспоминает, как создавал «случайный» сюжет только с 11 плоскостями, а консультант по программированию его компьютерного центра сказал ему, что он неправильно использовал генератор случайных чисел: «Мы гарантируем, что каждое число случайным образом индивидуально, но мыМы не можем гарантировать, что более одного из них случайны ». Это отодвинуло наше образование на выпускное образование как минимум на год!