Pregunta

Me gustaría generar un número de punto flotante aleatorio entre 2 valores.¿Cuál es la mejor manera de hacer esto en C#?

¿Fue útil?

Solución

Lo único que agregaría ericLa respuesta de es una explicación;Siento que saber por qué funciona el código es mejor que saber qué código funciona.

La explicación es esta:digamos que quieres 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 multiplicas por el rango obtendrás un número entre 0 y rango.

Entonces, esto nos daría dobles aleatorios entre 0,0 y 2,0:

rng.NextDouble() * 2.0

¡Pero los queremos entre 2,5 y 4,5!Cómo hacemos esto?Suma 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 sumamos 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 utilizadas.Me gusta expresarlo con nombres de variables más largos para no confundirme:

double NextDouble(Random rng, double min, double max)
{
    return min + (rng.NextDouble() * (max - min));
}

Otros consejos

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

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

Para dobles puedes reemplazar Next con NextDouble

Aquí hay un fragmento de cómo obtener números aleatorios criográficamente seguros:Esto completará los 8 bytes con una secuencia criptográficamente fuerte de valores aleatorios.

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

Para más detalles ver ¿Qué tan aleatorio es tu aleatorio? (inspirado en un artículo de CodingHorror sobre cómo barajar el mazo)

¿Qué tan aleatorio?Si puedes lidiar con pseudoaleatorios, entonces simplemente:

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

Si desea un número aleatorio "mejor", probablemente debería consultar el algoritmo Mersenne Twister.Mucha gente tiene ya lo implementé aunque para ti

Para una explicación de por qué Longhorn ha sido tan modificado: http://msdn.microsoft.com/en-us/magazine/cc163367.aspx Busque la implementación de NextDouble y la explicación de qué es un doble aleatorio.

Ese enlace también es un buen ejemplo de cómo usar números aleatorios criptográficos (como mencionó Sameer) solo con resultados útiles reales en lugar de un flujo de bits.

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