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