Dado el inicio y el final de un rango entero, ¿cómo puedo calcular un entero aleatorio distribuido normalmente entre este rango?¿Cómo se genera aleatoriamente distribuida normalmente desde un rango entero?
Me doy cuenta de que la distribución normal va - + infinito. Supongo que las colas pueden cortarse, así que cuando se calcule un azar fuera del rango, vuelva a calcular. Esto eleva la probabilidad de enteros en el rango, pero mientras este efecto sea tolerable (< 5%), está bien.
public class Gaussian
{
private static bool uselast = true;
private static double next_gaussian = 0.0;
private static Random random = new Random();
public static double BoxMuller()
{
if (uselast)
{
uselast = false;
return next_gaussian;
}
else
{
double v1, v2, s;
do
{
v1 = 2.0 * random.NextDouble() - 1.0;
v2 = 2.0 * random.NextDouble() - 1.0;
s = v1 * v1 + v2 * v2;
} while (s >= 1.0 || s == 0);
s = System.Math.Sqrt((-2.0 * System.Math.Log(s))/s);
next_gaussian = v2 * s;
uselast = true;
return v1 * s;
}
}
public static double BoxMuller(double mean, double standard_deviation)
{
return mean + BoxMuller() * standard_deviation;
}
public static int Next(int min, int max)
{
return (int)BoxMuller(min + (max - min)/2.0, 1.0);
}
}
Probablemente necesite escalar la desviación estándar de alguna forma relativa al rango, pero no entiendo cómo.
Respuesta:
// Will approximitely give a random gaussian integer between min and max so that min and max are at
// 3.5 deviations from the mean (half-way of min and max).
public static int Next(int min, int max)
{
double deviations = 3.5;
int r;
while ((r = (int)BoxMuller(min + (max - min)/2.0, (max - min)/2.0/deviations)) > max || r < min)
{
}
return r;
}
Sí, esto es lo que el BoxMuller (double mean, double standard_deviation) logra arriba. El problema, sin embargo, es que Next (int min, int max) devuelve valores muy cercanos a la mitad del rango. Esto es porque no entiendo cómo "escalar" la desviación correctamente. –
Entonces, para 3.5 desviaciones estándar, sería "return (int) BoxMuller (min + (max - min)/2.0, (max - min)/2.0/3.5);"? –
¿Puedo comentar que +/- 3 veces la desviación estándar no le da el 97% sino el 99.7%? +/- sigma: ~ 68% +/- 2sigma: ~ 95% +/- 3sigma: ~ 99.7% http://en.wikipedia.org/wiki/68-95-99.7_rule – DmitryK