c# - 十进制值的规范化
问题描述
我的问题是这样的:我需要从 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之间的基本区别是什么?
- 我怎样才能实现我想要做的事情?