我获得了所需的最小值,最大值和数组长度。如何使用指定的最小值和最大值生成适合此阵列的“正态分布”/钟形曲线的数字?
即
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 ]
答案 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));
请原谅我没有正确调整边界的懒惰,你也需要一些东西,特别是如果你想要整数值。
对于钟形曲线的情况,有多种选择: