给出最小值,最大值和长度的曲线

时间:2017-06-22 22:03:51

标签: c++ normal-distribution bell-curve

我获得了所需的最小值,最大值和数组长度。如何使用指定的最小值和最大值生成适合此阵列的“正态分布”/钟形曲线的数字?

min:0 最大:6 长度= 7

结果:[0,2,4,6,4,2,0]

我知道我可以在最小值和最大值之间进行线性插值以到达中间,然后在反向方向上向下回到数组末尾的最小值。但是,有没有办法使用发行版来做到这一点?然后从中拉取价值?

即。我在想这样的事情

max - min  = diff
diff / (length/2) = increment
[min + increment*index, ..., max, max - increment*index, ..., min ] 

1 个答案:

答案 0 :(得分:1)

如果您的问题确实是生成一个包含三角形形状值的数组,那么除了您建议的简单循环之外,还有其他事情要做。您甚至可以编写一个返回f(k)的函数。例如:

double get_kth_value(double min, double max, int length, int k) {
    int mid = length/2;
    if (k < mid) {
         return min + (max - min) * k / mid;
    } else {
         return min + (max - min) * (length - 1 - k) / mid;
    }
}

当你说:

  

但是,有没有办法使用发行版来做到这一点?然后拉   来自它的价值?

我想知道你是否暗示你的问题略有不同。措辞表明您希望根据给定的分布进行抽样。也就是说,你想为x计算y = f(x)一个均匀的随机变量,你获得给定y的概率由一些给定的分布(钟形,二项式,三角形,诸如此类型)规定。然后它变得更有趣(虽然超级经典)。

通用大锤是inverse transform sampling。您计算累积分布函数,然后就可以了。对于你建议三角形的情况,它很容易。基本上你会想要像

这样的东西
double t = 2*uniformly_random_double_in_01()-1;
double y = breadth/2*(1-sqrt(1-fabs(1-t)))*(1-2*(t<0));

请原谅我没有正确调整边界的懒惰,你也需要一些东西,特别是如果你想要整数值。

对于钟形曲线的情况,有多种选择:

  1. 如果您对无脑方法感到满意,可以尝试Box-Muller transform并截断结果。
  2. 如果您尝试获取与二项分布相关的内容,那么也有方法。见there