c# – 如何从整数范围生成正态分布随机?

c# – 如何从整数范围生成正态分布随机?,第1张

概述给定整数范围的开始和结束,如何计算这个范围之间的正态分布随机整数? 我意识到正态分布是无限的.我猜尾巴可以被截断,所以当一个随机值计算在范围之外时,重新计算.这提高了整数在该范围内的概率,但是只要该效果是可以忍受的(<5%),这是很好的. public class Gaussian{ private static bool uselast = true; private stat 给定整数范围的开始和结束,如何计算这个范围之间的正态分布随机整数?

我意识到正态分布是无限的.我猜尾巴可以被截断,所以当一个随机值计算在范围之外时,重新计算.这提高了整数在该范围内的概率,但是只要该效果是可以忍受的(<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;    }
解决方法 如果Box-Muller方法返回“标准”正态分布,则它将具有平均值0和标准偏差1.要转换标准正态分布,将随机数乘以X以获得标准偏差X,并添加Y以获得意思是Y,如果记忆正确地服务于我.

参见Wikipedia article’s section on normalizing standard normal variables (property 1)更正式的证明.

根据您的意见,经验法则是99.7%的正态分布将在标准偏差的±3倍之内.如果你需要从0到100的正常分配,比你的意思是一半,你的SD将是(100/2)/ 3 = 16.667.所以无论您从Box-Muller算法中得到什么值,乘以16.667“扩展”分布,然后添加50到“中心”.

约翰,为了回应你最新的评论,我真的不知道Next功能是什么意思.它总是使用标准偏差1,平均值在你的最小值和最大值之间.

如果你想要一个Y的平均值,其中〜99.7%的数字在-X到X的范围内,那么你只需要调用BoxMuller(Y,X / 3).

总结

以上是内存溢出为你收集整理的c# – 如何从整数范围生成正态分布随机?全部内容,希望文章能够帮你解决c# – 如何从整数范围生成正态分布随机?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1259489.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-07
下一篇 2022-06-07

发表评论

登录后才能评论

评论列表(0条)

保存