在Excel的NORMINV()

时间:2015-07-27 18:19:54

标签: excel math random normal-distribution standard-deviation

我尝试在C中编写Excel的NORMINV()时有一个奇怪的行为。作为norminv()我从数学家那里获取了this函数,它可能是正确的,因为我也尝试了不同的结果相同。这是代码:

double calculate_probability(double x0, double x1)
{
    return x0 + (x1 - x0) * rand() / ((double)RAND_MAX);
}

int main() {

long double probability = 0.0;
long double mean = 0.0;
long double stddev = 0.001;
long double change_percentage = 0.0;
long double current_price = 100.0;
srand(time(0));
int runs = 0;
long double prob_sum = 0.0;
long double price_sum = 0.0;

while (runs < 100000)
{
    probability = calculate_probability(0.00001, 0.99999);
    change_percentage = mean + stddev * norminv(probability); //norminv(p, mu, sigma) = mu + sigma * norminv(p)
    current_price = current_price * (1.0 + change_percentage);
    runs++;
    prob_sum += probability;
    price_sum += current_price;
}
printf("\n\n%f %f\n", price_sum / runs, prob_sum / runs);
return 0;
}

现在我要模拟Excel的NORMINV(rand(),0,0.001),其中rand()是一个值&gt; 0和&lt; 1,0是平均值,0.001是标准偏差。

1000个值看起来没问题:

100.729780 0.501135

有10000个值,它传播得太多:

107.781909 0.502301

有了100000个值,它有时会传播得更多:

87.876500 0.498738

现在我不知道为什么会这样。我的假设是随机数发生器也必须是正态分布的。在我的情况下,probability被计算得很好,因为平均值几乎是0.5。因此我不知道为什么平均偏差在增加。有人可以帮帮我吗?

1 个答案:

答案 0 :(得分:1)

你正在做一些random walk的事情,除了你的动作是乘法缩放因子而不是加法步骤。

考虑两个连续的举动,第一个提供20%的通货膨胀,第二个提供20%的通货紧缩。从100的基线开始,在第一步之后你是120.如果你现在占120的80%,你得到96而不是原来的100.换句话说,看似对称的​​缩放因子实际上不是对称的。虽然你的缩放因子是随机的,但它们仍然是围绕1对称创建的,所以我不会惊讶地看到偏差累积。