2010-02-25 17 views
9

que he estado haciendo algunas pruebas en la clase aleatoria y he utilizado el siguiente código:¿Qué tan aleatorio es Random.Next()?

while (x++ <= 5000000) 
     { 
      y = rnd.Next(1, 5000000); 
      if (!data.Contains(y)) 
       data.Add(y); 
      else 
      { 
       Console.WriteLine("Cycle {2}: Repetation found for number {0} after {1} iteration", y, x, i); 
       break; 
      } 
     } 

Seguí cambiando el límite rnd máximo (es decir, 5000000) y me ha cambiado el número de iteraciones y me dio la siguiente resultado:

1) if y = rnd.Next(1, 5000) : The average is between 80 to 110 iterations 
2) if y = rnd.Next(1, 5000000) : The average is between 2000 to 4000 iterations 
3) if y = rnd.Next(1, int.MaxValue) : The average is between 40,000 to 80,000 iterations. 

¿por qué recibo estos promedios, es decir, de cada 10 veces que he marcado para cada valor, el 80% de las veces me sale dentro de este rango promedio. No creo que podamos llamarlo casi aleatorio.

¿Qué puedo hacer para obtener un número bastante aleatorio?

+4

Se llama pseudoaleatorio por un motivo. –

+4

aleatorio no significa 'único'. – nos

+18

Felicidades por descubrir la paradoja del cumpleaños. (http://en.wikipedia.org/wiki/Birthday_problem) – kennytm

Respuesta

30

No está probando ciclos. Está probando cuánto tiempo lleva obtener un número aleatorio que haya tenido anteriormente. Eso es completamente diferente. Sus cifras son perfectas para probar cuánto tiempo lleva obtener un número aleatorio que tenía antes. Busque en wikipedia bajo "la paradoja del cumpleaños" un cuadro de la probabilidad de una colisión después de una cierta cantidad de iteraciones.

Coincidencialmente, la semana pasada escribí un artículo de blog sobre este tema exacto. Se lanzará en vivo el 22 de marzo; see my blog luego para más detalles.

Si lo que desea probar para la duración del ciclo es de un generador de números pseudo-aleatorios, entonces hay que buscar no es un número ha recibido anteriormente, sino más bien, una larga secuencia exacta de números que has tenido antes Hay varias formas interesantes de hacerlo, pero probablemente sea más fácil para mí solo decirte: la duración del ciclo de Aleatorio es de unos pocos miles de millones, por lo que es poco probable que puedas escribir un programa que descubra ese hecho. Tendría que almacenar un lote de números.

Sin embargo, la duración del ciclo no es la única medida de calidad de un generador de números pseudoaleatorios. Recuerde, los PRNG son no aleatorios, son predecibles, y por lo tanto, debe pensar muy cuidadosamente cuál es su métrica para "aleatoriedad".

Danos más detalles: ¿por qué te importa qué tan "aleatorio" sea el azar? ¿En qué aplicación lo estás usando para que te importe? ¿Qué aspectos de la aleatoriedad son importantes para ti?

+0

+1 @Eric: ¿Estás completando tu blog antes del lanzamiento? Eso es gracioso. – Zano

+6

@Zano: Sí, escribo una pila completa de artículos a la vez y luego los configuro para ponerlos en marcha dos veces por semana. Estoy cerca de dos meses en un momento dado. Raymond Chen publica como cinco o diez veces a la semana y tiene varios * años * en su lista; ¡No sé cómo lo hace! –

+0

Jeje, eso es gracioso. Pero, ¿no se quedan obsoletos los artículos, si lo haces años antes de tiempo? Por ejemplo, una versión más nueva de .NET o C# se comportaría de manera diferente, etc. –

2

Una computadora no puede generar un número aleatorio real. si necesita un número real aleatorio (David le dio la mejor opción de dot net framework) necesita una fuente externa aleatoria.

+1

Me gusta cómo random.org usa los ruidos en la perturbación atmosférica. –

3

Usted está juzgando la aleatoriedad por pares repetidos, que no es la mejor prueba de aleatoriedad. Las repeticiones que ve son similares a la paradoja del cumpleaños: http://en.wikipedia.org/wiki/Birthday_problem, donde un evento de repetición puede ocurrir con un tamaño de muestra pequeño si no está buscando un evento específico.

15

Está asumiendo que la aleatoriedad es mejor si los números no se repiten. Eso no es verdad.

La aleatoriedad real no tiene memoria. Cuando elige el siguiente número, la posibilidad de obtener el mismo número nuevamente es tan alta como cualquier otro número en el rango.

Si tira un dado y obtiene un seis, luego tira los dados nuevamente, no hay menos posibilidades de obtener un seis nuevamente. Si tienes dos seises seguidos, eso no significa que los dados están rotos.

La aleatoriedad en la clase Aleatoria, por supuesto, no es perfecta, pero eso no es lo que revela tu prueba. Simplemente muestra un fenómeno que se obtiene con cada generador de números rangos, incluso si realmente crea números aleatorios reales y no solo números pseudoaleatorios.

+0

+1 para los dados rotos –

+0

+1 muy bien explicado – Bhaskar

+0

Podría, en realidad. Tengo dados de 10 caras que aparecen 8,9,0 veces más a menudo que otros números. Son geniales para Marvel Super Heroes, pero son malos para otros juegos que quieren números más bajos. ES DECIR. Los dados PUEDEN romperse. – PRMan