我尝试在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。因此我不知道为什么平均偏差在增加。有人可以帮帮我吗?
答案 0 :(得分:1)
你正在做一些random walk的事情,除了你的动作是乘法缩放因子而不是加法步骤。
考虑两个连续的举动,第一个提供20%的通货膨胀,第二个提供20%的通货紧缩。从100的基线开始,在第一步之后你是120.如果你现在占120的80%,你得到96而不是原来的100.换句话说,看似对称的缩放因子实际上不是对称的。虽然你的缩放因子是随机的,但它们仍然是围绕1对称创建的,所以我不会惊讶地看到偏差累积。