在Excel的NORMINV()上增加样本大小的平均偏差

我有一个奇怪的行为,我尝试在C编写Excel的NORMINV()作为norminv()我从一个math家这个function,这可能是正确的,因为我也尝试不同的结果相同。 代码如下:

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()是> 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左右对称的,所以我并不惊讶看到偏差的累积。