En un generador de números pseudoaleatorios (PRNG), un ciclo completo o un período completo es el comportamiento de un PRNG sobre su conjunto de estados válidos. En particular, se dice que un PRNG tiene un ciclo completo si, para cualquier estado semilla válido , el PRNG atraviesa todos los estados válidos antes de volver al estado semilla, es decir, el período es igual a la cardinalidad del espacio de estados.
Las restricciones sobre los parámetros de un PRNG para que posea un ciclo completo se conocen solo para ciertos tipos de PRNG, como los generadores congruentes lineales y los registros de desplazamiento de retroalimentación lineal . No existe un método general para determinar si un algoritmo PRNG es de ciclo completo antes de agotar el espacio de estados, que puede ser exponencialmente grande en comparación con el tamaño del estado interno del algoritmo.
Ejemplo 1 (en C / C ++)
Dada una semilla de número aleatorio que es mayor o igual a cero, un tamaño de muestra total mayor que 1 y un coprime de incremento al tamaño de muestra total, se puede generar un ciclo completo con la siguiente lógica. Cada número no negativo menor que el tamaño de la muestra ocurre exactamente una vez.
semilla int sin firmar = 0 ; unsigned int tamaño_muestra = 3000 ; unsigned int generated_number = semilla % SAMPLE_SIZE ; incremento int sin signo = 7 ; para ( unsigned int iterador = 0 ; iterador < SAMPLE_SIZE ; ++ iterador ) { generated_number = ( generated_number + incremento ) % SAMPLE_SIZE ; }
Ejemplo 1 (en Python)
# Generador que pasa por un ciclo completo def cycle ( semilla : int , tamaño_muestra : int , incremento : int ): nb = semilla para i en rango ( tamaño_muestra ): nb = ( nb + incremento ) % tamaño_muestra rendimiento nb# Valores de ejemplo seed = 17 sample_size = 100 increment = 13# Imprime todos los números print ( lista ( ciclo ( semilla , tamaño_muestra , incremento )))# Verificar que todos los números se generaron correctamente aserción conjunto ( ciclo ( semilla , SAMPLE_SIZE , incremento )) == conjunto ( gama ( SAMPLE_SIZE ))