整数の範囲の開始と終了が与えられた場合、この範囲の間に正規分布したランダムな整数を計算するにはどうすればよいですか?整数範囲から正規分布乱数を生成する方法は?
私は、正規分布が+ +無限大になることを理解しています。私は尾部がカットオフできるので、ランダムが範囲外で計算されると、再計算することができます。これは、範囲内の整数の確率を高めますが、この効果が許容できる限り(< 5%)、問題ありません。
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);
}
}
おそらく、標準偏差を範囲に対してどのようにスケーリングする必要があるのでしょうか。理解できません。
回答:
// 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;
}
:
だから、この作品を修正BoxMuller(double mean、double standard_deviation)は上記のとおりです。しかし、問題は、Next(int min、int max)が範囲の半分に非常に近い値を返すことです。これは、偏差を正しくスケールする方法を理解していないためです。 –
3.5標準偏差では、 "return(int)BoxMuller(min +(max - min)/ 2.0、(max - min)/ 2.0/3.5)"となります。 –
標準偏差の+/- 3倍で、97%ではなく99.7%であるとコメントできますか? +/-シグマ:〜68% +/- 2sigma:〜95% +/- 3sigma:〜99.7% http://en.wikipedia.org/wiki/68-95-99.7_rule – DmitryK