【问题标题】:Creating a curve given min, max, and length在给定最小值、最大值和长度的情况下创建曲线
【发布时间】:2017-06-23 15:10:33
【问题描述】:

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

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

【问题讨论】:

  • 钟形曲线没有最小值和最大值。有一个平均值和标准偏差。从技术上讲,尾巴走向正无穷和负无穷。您的输出更像是三角波形。
  • @CoryKramer 对,明白。如果绘制,我希望数组本身模仿钟形曲线的形状。看我的例子
  • 近似有问题,因为[0,0,1,6,1,0,0]也是符合标准的钟形曲线

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


【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-11
    • 2014-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多