Полный цикл
В генераторе псевдослучайных чисел (ГПСЧ) полный цикл или полный период — это поведение ГПСЧ в его наборе допустимых состояний. В частности, говорят, что ГПСЧ имеет полный цикл, если для любого допустимого начального состояния ГПСЧ проходит каждое допустимое состояние перед возвратом в начальное состояние, т. е. период равен мощности пространства состояний.
Ограничения на параметры ГПСЧ, необходимые для того, чтобы он обладал полным циклом, известны только для определенных типов ГПСЧ, таких как линейные конгруэнтные генераторы и регистры сдвига с линейной обратной связью . Не существует общего метода определения того, является ли алгоритм PRNG полным циклом и не исчерпывает пространство состояний, которое может быть экспоненциально большим по сравнению с размером внутреннего состояния алгоритма.
Пример 1 (на C/C++)
[ редактировать ]Учитывая начальное значение случайного числа, которое больше или равно нулю, общий размер выборки больше 1 и приращение, взаимно простое с общим размером выборки, полный цикл может быть сгенерирован с помощью следующей логики. Каждое неотрицательное число, меньшее размера выборки, встречается ровно один раз.
unsigned int seed = 0;
unsigned int sample_size = 3000;
unsigned int generated_number = seed % sample_size;
unsigned int increment = 7;
for (unsigned int iterator = 0; iterator < sample_size; ++iterator)
{
generated_number = (generated_number + increment) % sample_size;
}
Пример 1 (на Python)
[ редактировать ]# Generator that goes through a full cycle
def cycle(seed: int, sample_size: int, increment: int):
nb = seed
for i in range(sample_size):
nb = (nb + increment) % sample_size
yield nb
# Example values
seed = 17
sample_size = 100
increment = 13
# Print all the numbers
print(list(cycle(seed, sample_size, increment)))
# Verify that all numbers were generated correctly
assert set(cycle(seed, sample_size, increment)) == set(range(sample_size))