2010-03-02 104 views

Respuesta

0

Todo depende de la semilla. La mayoría de los generadores de números aleatorios dan la misma secuencia de números para un valor de semilla fijo.

+14

* todos los generadores de números pseudoaleatorios * dan la misma secuencia de números para un valor de semilla fijo ... de lo contrario serían verdaderamente aleatorios en lugar de pseudoaleatorios. –

+1

@Tyler Voto ese comentario pero lo haces sonar como si no ser periódico fuera suficiente para ser aleatorio, lo cual no es (los decimales de pi no son aleatorios). Una vez me mostraron una buena definición de aleatoriedad en términos de la evolución asintótica de la complejidad de Kolmogorov de los prefijos de una cuerda infinita, pero no puedo encontrar una referencia en línea. –

+0

La aleatoriedad es de hecho un tema complicado. – zdav

2

Es aleatorio de la misma manera que cualquier generador de números pseudoaleatorios, es decir, nada.

Sin embargo, fibonacci retardado (y todos los PRNG de desplazamiento de realimentación lineal) mejoran en un generador congruente lineal básico al aumentar el tamaño del estado. Es decir, el siguiente valor depende de varios valores anteriores, en lugar de solo el anterior inmediato. Combinado con una semilla decente, debería poder obtener resultados bastante decentes.

Editar:

Desde su puesto, no está claro que entiende que el estado subyacente se almacena en un registro de desplazamiento, lo que significa que no es estático, sino actualizada (desplazando cada valor de un lugar a la izquierda, soltando el valor más a la izquierda y añadiendo el valor más reciente en el lado derecho) después de cada sorteo. De esta forma, se evita dibujar el mismo número sobre & una vez más (para la mayoría de los valores iniciales, al menos).

9

Para ser precisos, el Fibonacci rezagado es un pseudo-generador de números aleatorios. No es cierto al azar, pero es mucho mejor que, por ejemplo, el linear congruential generator (el generador estándar para C++, Java, etc.) más comúnmente utilizado. No estoy seguro de por qué crees que volverá a dar el mismo número, pero es verdad que como todos los generadores de números pseudoaleatorios, tiene un período después del cual la secuencia de números se repetirá nuevamente.

El multiplicador de GRS tiene un período de (2^k - 1)*2^(M-3). Para parámetros prácticos, esto es realmente bastante grande (el período de LCG es solo M).

La única pega con LFG es que el procedimiento de inicialización es muy complejo, y las matemáticas detrás de él están incompletas. Lo mejor es consultar la literatura para una buena elección de los parámetros y el procedimiento recomendado para la siembra adecuada.

Como ilustración, un LFG multiplicativo con los parámetros (j=31, k=52) y el módulo m=2^32 está sembrado con una matriz de 52 números de 32 bits.


referencias adicionales:

+0

la inicialización es compleja? Pensé que sería tan fácil como elegir pares (p, q) como los recomendados por Kudth. Tal vez una tabla suficientemente grande de tales pares. –

+1

Elegir (p, q) es solo arreglar el "motor". Lo "ejecuta" con una semilla de q números, que debe elegirse sabiamente. Al menos uno de estos números debe ser impar. De hecho, si mal no recuerdo, creo que todos tienen que ser extraños si estás usando LFG multiplicativo. Todavía hay muchas semillas posibles para elegir, por lo que su elección no es limitada, solo tiene que elegir cuidadosamente. Tradicionalmente, la semilla se genera con otro generador, como LCG. – polygenelubricants

4

No es al azar, su pseudorandom

De esta http://en.wikipedia.org/wiki/Lagged_Fibonacci_generator

generadores de Fibonacci rezagados tienen un plazo máximo de (2^k - 1) * 2^(M-1) si se usa la suma o la resta, y (2^k-1) si se usan operaciones exclusivas u para combinar los valores previos. Si, por otro lado, se usa la multiplicación, el período máximo es (2^k - 1) * 2^(M-3), o 1/4 del período del caso aditivo.

Por lo tanto, dado un cierto valor inicial, la secuencia de valores de salida es predecible y repetible, y tiene un ciclo. Se repetirá si espera lo suficiente, pero el ciclo es bastante grande.

Para un observador que no conoce el valor de inicialización, la secuencia parece ser bastante aleatoria, por lo que puede ser útil como fuente de "aleatoriedad" para simulaciones y otras situaciones donde no se requiere aleatoriedad real.

+0

Solo para aclarar, el valor de la semilla del que estamos hablando es como (31,52), (24,55), (31,55), (7,57), (50,57) ... ¿y así sucesivamente? Por lo tanto, para que parezca aleatorio, necesitamos un nuevo par (p, q) –

+0

Esos pares que enumeró no son la semilla. Son los parámetros '(j, k)'. – polygenelubricants

+0

@ chester.boo: esos son los valores de j & K, que controlan la secuencia y la duración del período. No son realmente lo que normalmente llamarías el valor de 'semilla', aunque cambiarlos cambiará la salida. También puede cambiar la salida simplemente eligiendo un lugar diferente en una secuencia dada para comenzar. –

-1

Los generadores de números aleatorios a menudo son funciones uno a uno donde para cada entrada hay una salida constante. Para hacerlo "aleatorio", debe alimentarlo con una semilla (que debe ser "aleatoria"), como la hora del sistema o los valores de las ubicaciones de la memoria de la computadora, por ejemplo.

Si se está preguntando por qué no usa directamente la semilla (el tiempo, etc.), es porque el tiempo es secuencial (1,2,3,4) mientras que la mayoría de los generadores de números pseudoaleatorios escupieron números que parecen aleatorios (8, 27, 13, 1). De esta forma, si está generando números pseudoaleatorios en un bucle (lo cual sucede muy rápido), no solo obtiene {1,2,3,4} ...

Cuestiones relacionadas