随着Excel的NORMINV()样本数量的增加而增加平均偏差



我有一个奇怪的行为在我试图编码Excel的NORMINV()在C.作为NORMINV()我从数学家那里得到了这个函数,它可能是正确的,因为我也尝试了不同的相同的结果。下面是代码:

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("nn%f %fn", price_sum / runs, prob_sum / runs);
return 0;
}

现在我想模拟Excel的NORMINV(rand(), 0,0.001),其中rand()是一个值> 0和<1,0是平均值,0.001是标准差。

1000个值看起来不错:

100.729780 - 0.501135

如果有10000个值,它会扩散得太多:

107.781909 - 0.502301

如果有100000个值,有时会扩散得更多:

87.876500 - 0.498738

我不知道为什么会这样。我的假设是随机数生成器也必须是正态分布。在我的例子中,probability计算得很好,因为均值一直都是0.5。因此,我不知道为什么平均偏差在增加。有人能帮帮我吗?

你正在做一些随机漫步的事情,除了你的移动是乘法缩放因子而不是加法步骤。

考虑两次连续的变动,第一次产生20%的通货膨胀,第二次产生20%的通货紧缩。从100的基线开始,第一步之后你就到了120。如果你现在取120的80%,你得到96,而不是原来的100。换句话说,看似对称的比例因子实际上并不对称。虽然你的比例因子是随机的,但它们仍然是在1周围对称地创建的,所以看到偏差累积我并不感到惊讶。

最新更新