首页 > 编程语言 >【C#】正态分布(高斯分布)算法

【C#】正态分布(高斯分布)算法

时间:2024-07-04 08:57:50浏览次数:13  
标签:deviation min C# double public max 正态分布 高斯分布

/// <summary>
/// 正态分布(高斯分布)
/// </summary>
public class Gaussian
{
    public const int MIU = 0;
    public const int SIGMA = 1;

    private readonly Random rnd;

    public Gaussian()
    {
        rnd = new Random((int)DateTime.Now.Ticks & 0xFFFFFF);
    }

    /// <summary>
    /// 获取一个指定范围内的标准正态分布随机数
    /// </summary>
    /// <param name="min">最小值(返回的值可包含最小值)</param>
    /// <param name="max">最大值(返回的值可包含最大值)</param>
    /// <returns></returns>
    public double Random(double min, double max) => Random2(min, max)[0];

    /// <summary>
    /// 获取一个或两个指定范围内的标准正态分布随机数
    /// </summary>
    /// <param name="min">最小值(返回的值可包含最小值)</param>
    /// <param name="max">最大值(返回的值可包含最大值)</param>
    /// <returns></returns>
    public double[] Random2(double min, double max)
    {
        if (max <= min) return new[] { min };

        var list = new List<double>();
        while (list.Count == 0)
        {
            foreach (var normal in GetValue(rnd, SIGMA, MIU))
            {
                var value = ConvertValue(normal, min, max);
                if (value >= min && value <= max)
                {
                    list.Add(value);
                }
            }
        }

        return list.ToArray();
    }

    /// <summary>
    /// 转换为指定范围内的值。返回结果可能会超出范围为,因为大约99.7%概率在范围内(3σ原则)。
    /// </summary>
    /// <param name="normal">正态分布数</param>
    /// <param name="min">最小值</param>
    /// <param name="max">最大值</param>
    /// <returns></returns>
    private static double ConvertValue(double normal, double min, double max)
    {
        var median = (max - min) / 2.0;

        return (normal * median / 3) + min + median;
    }

    /// <summary>
    /// 获取两个正态分布随机数
    /// </summary>
    /// <param name="random">生成随机数的对象</param>
    /// <param name="deviation">标准差σ</param>
    /// <param name="expected">期望值μ</param>
    /// <returns></returns>
    public static double[] GetValue(Random random, double deviation, double expected)
    {
        double x, y, s;
        do
        {
            x = 2 * random.NextDouble() - 1;
            y = 2 * random.NextDouble() - 1;
            s = x * x + y * y;
        }
        while (s > 1 || s == 0);
        double multi = Math.Sqrt(-2 * Math.Log(s) / s);

        //return new double[] { Math.Round(x * multi, 2) * deviation + expected, Math.Round(y * multi, 2) * deviation + expected };
        return new double[] { x * multi * deviation + expected, y * multi * deviation + expected };
    }
}

标签:deviation,min,C#,double,public,max,正态分布,高斯分布
From: https://www.cnblogs.com/qiutian-hao/p/18282898

相关文章

  • Why do STM32 initialization peripherals need to turn on the clock first?
    为什么Stm32初始化外设都需要先打开时钟理由一由于STM32属于低功耗的MCU,为了降低功耗,STM32的MCU在复位后会把绝大多数的外设时钟关闭,所以当用户需要使用到MCU内部的某个外设,就必须先开启定时器。理由二我们知道想要控制硬件,必须控制硬件的寄存器。然而在数字电路中,寄存器的作......
  • 汽车站车票管理系统(C++版)
    设计要求程序菜单功能一个汽车站每天有n班通往各地的车,每班车都有唯一的车次号(00100,00101,00102,…),发车时间,固定的路线(起始站、终点站),大致的行车时间,固定的额定载客量等信息。每班车信息如下:表1.汽车站汽车数据库列表车次                    ......
  • comfyui使用模型两种方式
    1、huggingface1.1原始用法是模型clone到本地,直接运行下面记录了git克隆大文件报错的问题https://github.com/git-lfs/git-lfs/issues/5749打开gitbash,直接执行GIT_CLONE_PROTECTION_ACTIVE=false就行这种方式应该也可以GIT_CLONE_PROTECTION_ACTIVE=false......
  • 【LeetCode 0232】【设计】用FILO栈实现FIFO队列
    ImplementQueueusingStacksImplementafirstinfirstout(FIFO)queueusingonlytwostacks.Theimplementedqueueshouldsupportallthefunctionsofanormalqueue(push,peek,pop,andempty).ImplementtheMyQueueclass:*voidpush(intx)Pushes......
  • 2024年华为OD机试真题- 分月饼-(C++/Java/python)-OD统一考试(C卷D卷)
      2024华为OD机试真题目录-(B卷C卷D卷)-【C++JavaPython】   题目描述中秋节,公司分月饼,m个员工,买了n个月饼,m≤n,每个员工至少分1个月饼,但可以分多个,单人分到最多月饼的个数是Max1,单人分到第二多月饼个数是Max2,Max1-Max2≤3,单人分到第n-1多月饼个......
  • vcpkg install 依赖慢的解决办法
    解决方案为了解决这个问题,我们可以利用第三方提供的GitHub镜像服务来加速下载。//类似的可以搜索ghproxy,在此感谢ghproxy!这里,我们将使用ghproxy.xiaopa.cc作为我们的GitHub镜像服务。 步骤一:设置环境变量打开Windows系统的“控制面板”。点击“系统和安全”......
  • C. Qingshan Loves Strings 2
    原题链接题解1.当10个数不一致时,无论怎样都不成立2.当01个数一致时,是否一定存在某种方法使得成立呢?3.对于长度为\(k\)的字符串\(s\),若不合法,那我在旁边添加一个01,则我们可以连续删除两边的配对数字,且至少能删除一对,且经过若干轮的删除一定能使字符串长度减小总的来说,我们......
  • 腾讯cos使用
    1、腾讯cos免费试用6个月:https://console.cloud.tencent.com/cos2、创建好bucket: 3、Linux系统下coscmd工具安装,coscmd命令参考:https://cloud.tencent.com/document/product/436/10976#yuminstallpython3#yuminstallgcc#pip3installcoscmd-ihttps://mirrors......
  • ENDLESS vs INFINITE coca 搭配
       WORD 1: ENDLESS  WORDW1W2  PARADE1270  MEETINGS830  DISCUSSIONS590  DEBATE1071  HOURS3045  MILES571  SPECULATION561  STREAM3226  WAR2685  SUMMER1755  WARS1755......
  • 用原始的TOMCAT进行项目打包,然后启动项目
          周末的时候在整理资料,无意中发现了大二时候做的超市订单管理系统项目。瞬间让我想起了大学时自学Java那段艰苦的过程,我记得我最开始的时候学习Java,是从javaSE,然后到javaEE,然后ssh,ssm,springboot,springcloud。这样子的一个过程。现在java的学习路线,很多已经是把......