Articulo de referencia

Ciclo completo

En un generador de números pseudoaleatorios (PRNG), un ciclo completo o período completo describe el comportamiento del PRNG sobre su conjunto de estados válidos. En particular,...

En un generador de números pseudoaleatorios (PRNG), un ciclo completo o período completo describe el comportamiento del 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 recorre todos los estados válidos antes de regresar 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 generador de números pseudoaleatorios (PRNG) para que complete un ciclo solo se conocen para ciertos tipos de PRNG, como los generadores congruenciales lineales y los registros de desplazamiento con retroalimentación lineal . No existe un método general para determinar si un algoritmo PRNG está a punto de completar un ciclo, es decir, si no se agota 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++)

Dado un número aleatorio inicial mayor o igual a cero, un tamaño de muestra total mayor que 1 y un incremento coprimo con el 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 muestra aparece exactamente una vez.

entero sin signo semilla = 0 ; entero sin signo tamaño_muestra = 3000 ; entero sin signo número_generado = semilla % tamaño_muestra ; entero sin signo incremento = 7 ;for ( unsigned int iterador = 0 ; iterador < tamaño_muestra ; ++ iterador ) { número_generado = ( número_generado + incremento ) % tamaño_muestra ; }

Ejemplo 1 (en Python)

# Generador que realiza un ciclo completo def cycle ( seed : int , sample_size : int , increment : int ): nb = seed for i in range ( sample_size ): nb = ( nb + increment ) % sample_size yield nb# Valores de ejemplo semilla = 17 tamaño_muestra = 100 incremento = 13# Imprimir todos los números print ( lista ( ciclo ( semilla , tamaño_muestra , incremento )))# Verificar que todos los números se generaron correctamente assert set ( cycle ( seed , sample_size , increment )) == set ( range ( sample_size ))

Véase también