首页 > 解决方案 > 十进制值的规范化

问题描述

我的问题是这样的:我需要从 Gaussin/Norma 分布中生成一个随机数,并创建一个宽度为 0.1 的直方图。

class Gaussian
{
    public static double Next(Random r, double mu = 0, double sigma = 1)
    {
        var u1 = r.NextDouble();
        var u2 = r.NextDouble();

        var rand_std_normal =   Math.Sqrt(-2.0 * Math.Log(u1)) *
                                Math.Sin(2.0 * Math.PI * u2);

        var rand_normal = mu + sigma * rand_std_normal;

        return rand_normal;
    }
}

我正在使用上面的函数来生成一个高斯随机值。

现在,为了创建直方图,我需要一种能够自动将高斯值转换为数组索引的计算。类似于以下内容:

    static void Main(string[] args)
    {
        const int N = 1000;
        int time = N;
        const double binsDistance = 0.1;
        int binsCount = (int)(N * binsDistance);

        Random rand = new Random();
        int[] array = new int[binsCount];
        int side = 0;
        for (int i = 0; i < time; i++)
        {
            double gauss = Gaussian.Next(rand);
            int binNo = Normalization.Normalize(0, binsCount - 1, gauss);
            array[binNo]++;
        }
    }

为此,我尝试了两种计算。

  1. 一个在这里
  2. 第二个在这里

第一个问题是,它不能正确处理负数。

第二个的问题是,它产生了太多的零值。

所以,我有两个问题:

  1. #1和#2之间的基本区别是什么?
  2. 我怎样才能实现我想要做的事情?

标签: c#histogramscalinggaussianminmax

解决方案


推荐阅读