2

如果我有数据(每日股票图表是一个很好的例子,但它可能是任何东西),其中我只知道 X 单位销售的范围(高 - 低),但我不知道任何给定项目的确切价格卖。为简单起见,假设价格范围包含足够的桶(例如,40 美分范围内的 41 美分增量)以使这种分布可行。如何分配这些项目以形成存储在向量中的正常钟形曲线?它不必是完美的,而是现实的。

我(非常)天真的想法是假设由于随机数应该形成正态分布,我可以做一些事情,比如有一个二进制 RNG。例如,如果有 40 个存储桶,那么如果“0”出现 40 次,则第 0 个存储桶会递增,如果连续出现“1”多次,则第 39 个存储桶会递增。如果“1”出现 20 次,则它位于向量的中间。对每个项目执行此操作,直到计算完 X 个单位。这可能是正确的,也可能不是正确的,并且在任何情况下似乎都比必要的效率低得多。我正在寻找更明智的东西。

这不是家庭作业,只是一直困扰着我的一个问题,我的统计数据达不到标准。大多数文献似乎都是关于分析已经存在的分布,而不是关于如何人为地创建分布。

我想用 C++ 写这个,所以在 R 或 matlab 或诸如此类的预打包解决方案对我来说不太有用。

谢谢。我希望这是有道理的。

4

2 回答 2

8

大多数文献似乎都是关于分析已经存在的分布,而不是关于如何人为地创建分布。

有大量关于如何创建的文献。Box-Muller 变换、Marsaglia 极坐标法(Box-Muller 的一种变体)和 Ziggurat 算法是三个。(谷歌这些条款)。两种 Box-Muller 方法都易于实现。

更好的是,只需使用已经存在的实现这些算法之一的随机生成器。boost 和新的 C++11 都有这样的包。

于 2012-06-14T17:56:12.807 回答
3

您描述的算法依赖于中心极限定理,该定理说定义为n属于同一n分布的随机变量之和的随机变量在增长到无穷大时趋于接近正态分布。来自计算机 PRNG 的均匀分布的伪随机变量构成了这个一般定理的一个特例。

为了获得更有效的算法,您可以将概率密度函数视为某种空间扭曲,它在中间扩展实轴并将其缩小到末端。

令 F: R -> [0:1] 是正态分布的累积函数,invF 是它的逆函数,x 是均匀分布在 [0:1] 上的随机变量,那么 invF(x) 将是一个正态分布的随机变量.

实现这一点所需要做的就是能够计算 invF(x)。不幸的是,这个函数不能用初等函数来表达。实际上,它是非线性微分方程的解。但是,您可以使用牛顿法有效地求解方程 x = F(y)。

我所描述的是逆变换方法的简化表示。这是一种非常通用的方法。有一些专门的算法可以更有效地从正态分布中采样。David Hammen 的回答中提到了这些。

于 2012-06-14T17:56:13.740 回答