Dato l'inizio e la fine di un intervallo intero, come faccio a calcolare un intero casuale distribuito normalmente tra questo intervallo?Come generare casuale distribuito casualmente da un intervallo intero?
Mi rendo conto che la distribuzione normale va in - + infinito. Immagino che le code possano essere tagliate, quindi quando un random viene calcolato al di fuori dell'intervallo, ricalcalo. Questo eleva la probabilità di numeri interi nell'intervallo, ma finché questo effetto è tollerabile (< 5%), va bene.
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);
}
}
probabilmente ho bisogno di scalare la deviazione standard in qualche modo rispetto alla gamma, ma non capisco come.
Risposta:
// 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ì, questo è ciò che il BoxMuller (double mean, double standard_deviation) raggiunge sopra. Il problema, tuttavia, è che il prossimo (int min, int max) restituisce valori molto vicini alla metà del range. Questo perché non capisco come "scalare" correttamente la deviazione. –
Quindi per 3,5 deviazioni standard, sarebbe "return (int) BoxMuller (min + (max - min)/2.0, (max - min)/2.0/3.5)"? –
Posso solo commentare che +/- 3 volte la deviazione standard non ti dà il 97% ma il 99,7%. +/- sigma: ~ 68% +/- 2sigma: ~ 95% +/- 3sigma: ~ 99,7% http://en.wikipedia.org/wiki/68-95-99.7_rule – DmitryK