创建给定最小值、最大值和长度的曲线

Creating a curve given min, max, and length

我得到了数组所需的最小值、最大值和长度。如何生成符合此数组的 "normally distributed" / 钟形曲线的数字,具有指定的最小值和最大值?

分钟: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 ] 

如果您的问题确实是用三角形的值生成一个数组,那么除了您建议的简单循环之外,没有什么可做的了。您甚至可以编写一个 returns 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;
    }
}

当你说:

However, is there a way to do this using a distribution? then pull values from it?

我想知道您是否在暗示您的问题略有不同。措辞表明你想根据给定的分布进行抽样。也就是说,您想为 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