Алгоритм собственно ПСЧ (Псевдо-генератор случайных чисел) будет иметь время цикла, в течение которого он никогда не будет в том же состоянии. Если вы подвергаете все состояние PRNG числа, извлеченное из него, вы получите номер гарантированно уникальной для периода генератора.
Простой ПСЧ , который делает это называется « линейный конгруэнтная PRNG» , который итерирует формулу:
X(i) = AX(i-1)|M
Используя правильную пару факторов вы можете получить в период 2 ^ 30 (примерно 1 миллиард) от простого ПСЧ с 32 битным аккумулятором. Обратите внимание, что вам потребуется 64 бит долго долго временной переменной для хранения промежуточного «AX» часть вычислений. Большинство, если не все компиляторы будут поддерживать этот тип данных. Вы также должны быть в состоянии сделать это с числовым типом данных на большинстве диалектов SQL.
С правильными значениями А и М можно получить генератор случайных чисел с хорошими статистическими и геометрическими свойствами. Существует известная статья об этом написано Фишмана и Мур.
Для M = 2 ^ 31 - 1 получает можно использовать значение А ниже, чтобы получить ПСЧ с красивым длинным периодом (2 ^ 30 IIRC).
Хорошие значения A:
742,938,285
950,706,376
1,226,874,159
62,089,911
1,343,714,438
Обратите внимание , что этот тип генератора (по определению) не криптографически безопасный. Если вы знаете , последний номер сгенерированный из него вы можете предсказать , что он будет делать дальше. К сожалению , я считаю , что вы не можете получить криптографическую защиту и гарантированную неповторяемость одновременно. Для ПГСЧ быть криптографический безопасным (например , Блюм Блюм Шубы ) он не может выставить достаточное состояние в сгенерированном числе , чтобы позволить следующему номеру в последовательности , чтобы быть предсказан. Поэтому внутреннее состояние шире , чем сгенерированное число и (для того , чтобы иметь хорошую безопасность) период будет больше , чем число возможных значений , которые могут быть сгенерированы. Это означает , что обнаженный номер не будет уникальным в пределах периода.
По тем же причинам , то же самое относится и к длиннопериодических генераторов , таких как Вихрь Мерсенна.