2008-09-04 19 views

Respuesta

60

Lo único que añadiría a la respuesta de Eric es una explicación; Siento que el conocimiento de por qué funciona el código es mejor que saber qué código funciona.

La explicación es la siguiente: supongamos que quiere un número entre 2.5 y 4.5. El rango es 2.0 (4.5 - 2.5). NextDouble solo devuelve un número entre 0 y 1.0, pero si lo multiplica por el rango obtendrá un número entre 0 y rango.

lo tanto, esto nos daría dobles azar entre 0.0 y 2.0:

rng.NextDouble() * 2.0

Pero, queremos que entre 2,5 y 4,5! Cómo hacemos esto? Agregue el número más pequeño, 2.5:

2.5 + rng.NextDouble() * 2.0

Ahora, obtenemos un número entre 0.0 y 2.0; si agrega 2.5 a cada uno de estos valores, vemos que el rango ahora está entre 2.5 y 4.5.

Al principio pensé que importaba si b> a o a> b, pero si lo resuelves en ambos sentidos, encontrarás que funciona de manera idéntica siempre y cuando no estropees el orden de las variables usado. Me gusta expresarlo con nombres de variables más largos por lo que no se confundan:

double NextDouble(Random rng, double min, double max) 
{ 
    return min + (rng.NextDouble() * (max - min)); 
}
2
// generate a random number starting with 5 and less than 15 
Random r = new Random(); 
int num = r.Next(5, 15); 

en dobles se puede reemplazar con NextDouble Siguiente

+1

Eso no es realmente exacto. NextDouble genera solo entre 0.0 y 1.0. – Bloodyaugust

+3

NextDouble() no toma argumentos de lo que puedo ver. –

20
System.Random r = new System.Random(); 

double rnd(double a, double b) 
{ 
    return a + r.NextDouble()*(b-a); 
} 
1

Cómo azar? Si se puede tratar con pseudo-aleatorio entonces simplemente:

Random randNum = new Random(); 
randNum. NextDouble(Min, Max); 

Si desea una "mejor" de números aleatorios, entonces es probable que debe buscar en el algoritmo Mersenne Twister. Mucha gente hav already implemented it para usted aunque

1

Aquí hay un fragmento de cómo obtener números aleatorios Cryographically seguras: Esto llenará en los 8 bytes con un fuerte crytographically secuencia de valores aleatorios.

byte[] salt = new byte[8]; 
RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider(); 
rng.GetBytes(salt); 

Para más detalles ver How Random is your Random??" (inspirado por un artículo codinghorror en la baraja el mazo)

1

Para una explicación de por qué Longhorn ha sido downmodded tanto: http://msdn.microsoft.com/en-us/magazine/cc163367.aspx Look para la ejecución de NextDouble y la explicación de lo es un doble al azar.

Ese enlace también es un buen ejemplo de cómo usar números aleatorios criptográficos (como se menciona Sameer) solo con salidas realmente útiles en lugar de una secuencia de bits.

Cuestiones relacionadas