정수 범위의 시작과 끝이 주어지면이 범위 사이의 정규 분포 난수를 어떻게 계산합니까?정수 범위에서 정규 분포 랜덤을 생성하는 방법은 무엇입니까?
나는 정규 분포가 + + 무한대로 간다는 것을 알고있다. 꼬리가 잘릴 수 있으므로 임의가 임의 범위 밖에서 계산되면 다시 계산할 수 있습니다. 이것은 범위의 정수 확률을 높이지만,이 효과가 허용되는 한 (< 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 % +/- 2 시그마 : ~ 95 % +/- 3 시그마 : ~ 99.7 % http://en.wikipedia.org/wiki/68-95-99.7_rule – DmitryK