Pregunta

He estado haciendo algunas pruebas en la clase Random y he usado el siguiente código:

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 máximo de rnd (es decir,5000000) y cambié el número de iteraciones y obtuve el 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é obtengo estos promedios, es decir?de cada 10 veces que revisé cada valor, el 80% de las veces estoy dentro de este rango promedio.No creo que podamos llamarlo ni cercano a ser Aleatorio.

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

¿Fue útil?

Solución

No estás probando ciclos.Estás probando cuánto tiempo lleva obtener un número aleatorio que has tenido antes.Eso es completamente diferente.Tus cifras son acertadas para probar cuánto tiempo lleva obtener un número aleatorio que tenías antes.Busque en Wikipedia bajo "la paradoja del cumpleaños" un gráfico de la probabilidad de sufrir una colisión después de un cierto número de iteraciones.

Casualmente, la semana pasada escribí un artículo de blog sobre este tema exacto.Estará disponible el 22 de marzo; ver mi blog luego para más detalles.

Si lo que desea probar es la duración del ciclo de un generador de números pseudoaleatorios, entonces no debe buscar un número has tenido antes, sino más bien, un secuencia exacta larga de números que has tenido antes.Hay varias formas interesantes de hacerlo, pero probablemente sea más fácil para mí decírtelo:la duración del ciclo de Random es de unos pocos miles de millones, por lo que es poco probable que puedas escribir un programa que descubra ese hecho.Tendrías que guardar un lote de números.

Sin embargo, la duración del ciclo no es la única medida de la calidad de un generador de números pseudoaleatorios.Recuerde, los PRNG son no al azar, ellos son previsible, y, por lo tanto, debe pensar con mucho cuidado cuál es su métrica de "aleatoriedad".

Danos más detalles:¿Por qué te importa lo "aleatorio" que sea Random?¿Para qué aplicación lo estás usando y te interesa?¿Qué aspectos de la aleatoriedad son importantes para usted?

Otros consejos

Se está asumiendo que la aleatoriedad es mejor si los números no se repiten. Eso no es cierto.

aleatoriedad real no tiene una memoria. Cuando usted coge el siguiente número, la oportunidad de obtener el mismo número es tan alto como cualquier otro número en el rango.

Si tiras un dado y obtener un seis, a continuación, tirar los dados una vez más, no hay menos posibilidades de conseguir un nuevo seis. Si le sucede a obtener dos seises en una fila, eso no quiere decir que los dados se rompe.

La aleatoriedad en la clase Random que por supuesto no es perfecto, pero eso no es lo que revela la prueba. Simplemente muestra una penomenon que se obtiene con cada generador de números ranom, aunque en realidad crea números aleatorios reales y los números no sólo pseudo-aleatorios.

juzgan aleatoriedad por pares de repetición, que no es la mejor prueba para la aleatoriedad. Las repeticiones que se ven son similar 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 pequeño de la muestra si no está buscando un evento específico.

Por la documentación en http://msdn.microsoft.com /en-us/library/system.random.aspx

  

Para generar un criptográficamente seguro   de números aleatorios adecuado para crear una   contraseña aleatoria, por ejemplo, el uso de una   clase derivada de    System.Security.Cryptography .. ::. RandomNumberGenerator   como    System.Security.Cryptography .. ::. RNGCryptoServiceProvider.

Un ordenador no puede generar un número aleatorio real. Si necesita un número aleatorio real (David le dio la mejor opción en el marco punto net) que necesita una fuente externa al azar.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top