如果您的问题真的是生成一个包含三角形值的数组,那么除了您建议的简单循环之外,没有什么可做的了。你甚至可以编写一个返回的函数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));
请原谅我没有正确调整边界的懒惰,你也需要一些东西,特别是如果你想要整数值。
对于钟形曲线,有多种选择:
- 如果您对无脑方法感到满意,您可以尝试Box-Muller 变换并截断结果。
- 如果您试图获得与二项式分布相关的东西,那么也有一些方法。见那里。