生成随机曲线

时间:2014-03-04 10:16:09

标签: php math random graph curve

这可能更像是一个数学问题而不是直接编程问题。

我正在尝试创建一条曲线,在我的剧本中模拟市场对您产品的兴趣(我正在制作模拟游戏)。

必须满足一些标准

  • 曲线必须随机生成
  • 曲线在 x 轴上有16个步骤,曲线可以在每个步骤增加或减少
  • 曲线在 y
  • 上有100个步骤
  • 曲线可以从 y 轴上的任何位置开始,但必须从 x 轴的步骤0开始
  • 增量和减量应该是现实的,这意味着它们应该在每一步都略微增加或减少,尽管更大/更小的增量/减量发生的可能性更小。

考虑以下图片作为我正在尝试实现enter image description here

的示范

我最初的想法是,对于每个步骤,我会用随机数增加或减少它,当前步骤越高,曲线下降的几率就越高,但是这个想法有一些错误,比如这一步骤发生了重大变化。

我编码这是PHP,但理论应该适用于任何编程语言,关于如何生成随机图的最佳方法的任何想法如上所示?

最后,我只需要图表的实际数字,这样我就可以存储数据。我在想一个多维数组,所以我可以在一个数组中存储多个图形,如下所示: (免责声明,打击示例,不是基于图表)

$graph = array('Americas' => array(0, 15, 20, 33, 34, 38, 47, 52, 60, 65, 73, 23, 18, 12, 16, 18, 22));

3 个答案:

答案 0 :(得分:3)

您可能想要的以及在市场描述中常规使用的是几何布朗运动。在抽象术语中,它由随机微分方程定义

dX(t)=X(t)*[ r*dt+s*dB(t) ]

其中r是漂移或平均增长,s是方差或波动率,dB(t)是遵循正态分布N(0,dt)的随机变量。可以将t = t0 + k *Δt离散化为

X(t+Δt)=X(t)*[ 1+r*Δt±s*√(Δt) ]

其中符号随机选择,每个方向的概率为0.5。这适用于非常小的Δt值。对于较大的步骤,请使用

X(t+Δt)=X(t)*[ 1+r*Δt+s*z(t)*√(Δt) ]

其中随机变量z(t)遵循标准正态分布。

对于更复杂的方法,请参阅“没有痛苦的财务计算”[1]

[1] http://cs.uwaterloo.ca/~paforsyt/agon.pdf

答案 1 :(得分:1)

您可以将其设为Markov Chain / random walk(虽然原则上两者都相似)

对于马尔可夫链 - 您需要一个100x100矩阵,其转换概率根据您的要求(步长,变化率等)

对于随机游走 - 将下一步模型作为根据要求从适当分布中抽取的随机变量。

答案 2 :(得分:0)

LutzL和Nishanth给出的答案是完全正确的。我在这里提供的只是简化。实现其建议的一种方法是:生成随机数列表,然后通过保持运行总计来构建要绘制的数据。即:给定列表x[0], x[1], x[2], ..., x[n - 1],计算x[0], x[0] + x[1], x[0] + x[1] + x[2], ..., x[0] + x[1] + x[2] + ... + x[n - 1]并绘制该图。

随机数x[0], x[1], x[2], ..., x[n - 1]可以从几乎任何分布中得出;为了您的目的,均匀分布是好的(可能将数字乘以比例因子以使它们更大或更小)并且可能将x[0]设置为某个恒定偏移(否则绘图以x轴为中心)。选择不同的分布会改变构造的部分和的理论属性,但这对您的目的无关紧要。