如何产生通常由一个整数范围内随机分布?(How to generate normally distr

2019-07-02 10:10发布

由于开始和一个整数范围的结束,我怎么计算在这个范围之间正态分布随机整数?

我认识到,正态分布进入 - +无穷大。 我猜尾部可截止,所以当随机被计算的范围内,重新计算之外。 这个升高在范围内的整数的概率,但只要这样的效果是可以容忍的(<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;
    }

Answer 1:

如果箱穆勒方法返回一个“标准”正态分布,它将有均值为0,标准偏差1.将标准正态分布,你用X乘以你的随机数来获得标准偏差X,你加上y获得意思是Y,如果没记错的话。

见维基百科文章的正常化标准正态分布变量(属性1)第一个更正式的证明。


在回答您的意见,经验法则是正态分布的99.7%将是+/- 3倍标准差之内。 如果你需要从0正态分布100例如,比你平均会中途,你的SD会(100/2)/ 3 = 16.667。 所以,无论你重视拿出你箱穆勒算法,乘以16.667为“拉伸”的散发出来,再加入50至“中心”了。


约翰,响应你的最新评论,我真的不知道什么是点Next功能。 它总是使用为1的标准差和您的最小值和最大值之间一半的平均值。

如果你想y的平均值,与在〜范围-X到+ X的数字99.7%,那么你只需要调用BoxMuller(Y, X/3)



Answer 2:

那么,-2 *西格玛.. + 2 *西格玛会给你的钟形曲线的95%。 (检查已经提到维基文章中的“标准偏差和置信区间”部分)。

因此,修改这片:

return (int)BoxMuller(min + (max - min) / 2.0, 1.0);

和更改1.0(标准差)到2.0(或者甚至更多,如果你想超过95%的覆盖率)

return (int)BoxMuller(min + (max - min) / 2.0, 2.0);


文章来源: How to generate normally distributed random from an integer range?