Investigación:
Hola chicos,
si se utiliza el constructor sin parámetros new Random()
la semilla está en función de la servertime actual.
Aleatorio(): "Inicializa una nueva instancia de la clase aleatoria, utilizando una función del tiempo" http://msdn.microsoft.com/en-us/library/system.random.aspx
Por lo tanto, si trato de esta manera:
for(int i = 0; i < 1000; i++)
{
Random ran = new Random();
Console.WriteLine(ran.Next(50001));
}
¡Solo recibo 3 números diferentes alrededor de 300 veces en un millar de llamadas! No es tan al azar ...
Al establecer la semilla en el constructor new Random(0)
se devuelve una serie de números corregidos.
p. Ej. new Random(0).Next(50)
siempre! devuelve 36. Inténtalo tú mismo, si no confías en mí;
Lo que necesitamos para los números aleatorios "reales" es una semilla cambiante, eso es independiente del tiempo.
estoy usando Hashcode de valores cambiantes:
por ejemplo Guid.NewGuid().GetHashCode()
o DateTime.Now.GetHashCode()
Resultado:
Random ran = new Random(Guid.NewGuid().GetHashCode());
for(int i = 0; i < 1000; i++)
{
Console.WriteLine(ran.Next(50001));
}
o (para un mejor rendimiento):
for(int i = 0; i < 1000; i++)
{
int val = Guid.NewGuid().GetHashCode() % 50001;
val = val > 0 ? val : -val;
Console.WriteLine(val);
}
PS: El máximo de la -method siguiente (max) es siempre máximo - 1;
-> ran.Next (11) puede devolver 0,1,2, ..., 8,9,10. ¡No 11!
Saluda Bahamut =)
Usted necesita ser específico acerca de cómo se defina "más al azar" – cordialgerm
por qué estás ordenando números aleatorios? ¿eso no derrota el propósito de generar números aleatorios? – helloworld922
¿Podría ser el problema con la clasificación? – Marlon