0

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

IE

最小值: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 ] 
4

1 回答 1

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;
    }
}

当你说:

但是,有没有办法使用发行版来做到这一点?然后从中提取价值?

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

通用的大锤是逆变换采样。您计算累积分布函数,然后就可以了。对于您建议的三角形的情况,这很容易。基本上你会想要类似的东西

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 变换并截断结果。
  2. 如果您试图获得与二项式分布相关的东西,那么也有一些方法。见那里
于 2017-06-22T22:36:59.817 回答