【问题标题】:Distribute number over a bell curve在钟形曲线上分布数字
【发布时间】:2012-10-26 17:00:49
【问题描述】:

我正在寻找一个产生类似于钟形曲线的数学函数(想想)。我在这里非常不了解。我认为高斯函数可能是我需要的,但我不知道如何正确应用它来达到我的目的。

我将使用该函数对一系列对象进行动画处理:

我想通过将每个对象偏移到前一个对象的位置来模拟这个动画的加速和减速的外观,直到中间点,之后偏移量又回到原来的值:

一旦实现,我希望函数接受我在 x 轴上的起点和终点,以及需要容纳的对象数量。然后它应该返回一系列值,这些值将成为每个对象的 x 原点。

例如:

开始:0 结束:100 对象:20

平面分布:0、5、10、15、20、25、30、35、40、45、50、55、60、65、70、75、80、85、90、95

所需结果:0、10、19、27、34、40、44、45、46、47、48、49、50、51、55、60、66、73、81、90

对曲线的轮廓进行一些控制也会很好 - 例如,我上面的估计值是一个相当“平坦”的钟形(项目 7-14 具有相同的偏移量)。

【问题讨论】:

  • 这称为生成变体。我们在这里说的是什么计算机语言?
  • 也称为“偏差”。
  • 我将在 Objective-c 中实现它。感谢您的提示 - 所有的好谷歌果汁。

标签: objective-c algorithm math


【解决方案1】:

考虑以下三次多项式:

f(x,a) = 4ax^3 - 6ax^2 + 2ax + x

在域 x in [0:1] 上进行评估,a 保持不变并从区间“[0:1]”中选择。

这将生成从零开始到一结束的绘图。如果a==0,你会得到一条直线。如果a==1,你会得到一个很深的曲线。对于介于两者之间的a,你会得到介于两者之间的东西。

一旦您为a 选择了一个合适的值,您只需在 0 和 1 之间的任意多个点进行评估。然后您缩放这些值以适合您想要的范围。


此电子表格屏幕截图提供了两个示例。 A 列和 F 列保存 a 的值,B 列和 G 列保存 x 的值(如果您想使用平面分布中的确切值,您可以将 x 的每个用法更改为 x/100) . C 列和 H 列保存f(x,a) 的结果。 D列和我持有f(x,a)*100

【讨论】:

  • 哈,我现在在我的桌面上打开了几乎完全相同的电子表格。非常感谢。
  • @BenPackard 对于它的价值,我通过说我想要一个三次函数f(x)=Ax^3+Bx^2+Cx+D 找到了这一点。然后我说f(0)=0f(1)=1f'(.5)=af''(.5)=0。然后我解决了(A,B,C,D)
【解决方案2】:

这是一个用于生成正常偏差的 Java 实现:

/** generation of a Gaussian deviates (variants) by the ratio of uniform method */
final public static double generateNormalDeviate( final double mean, final double std_deviation ){
    double u, v, x, y, q;
    do {
        u = random.nextDouble();
        v = 1.7156 * ( random.nextDouble() - 0.5 );
        x = u - 0.449871;
        y = (v < 0 ? v * -1 : v) + 0.386595;
        q = x*x + y * (0.19600 * y - 0.25472 * x);
    } while( q > 0.27597 &&
            (q > 0.27846 || v*v > -4d * Math.log(u) * u*u));
    return mean + std_deviation * v / u;
}

有关更多信息和 C 版本,请参阅 Press Numeric Recipes。

【讨论】:

【解决方案3】:

IIRC [-1..1] 中的 N 个独立随机数之和很好地近似于中心为 0 的高斯曲线,我不记得分散度是多少。

编辑:不明白这个问题。您似乎需要实现 this 的东西,确切地说是“逆误差函数”,您可能希望在您的代码中实现它的近似值,因为函数本身是一个整数,不能在基本函数中进行评估。一旦你得到函数为钟形曲线点提供正确的近似值,你就可以清楚地把一个 0-1 的数字作为基数(这将定义钟形曲线的平坦度),将它命名为 B,然后将你的 N 个数字均匀分布在(-1+ B) 和 (1-B),然后将该函数的输出作为钟形曲线位置,然后对其进行归一化,使最左边的在开始处和最右边的结束处。

【讨论】: