Tag: vba

避免蒙特卡罗模拟中的基本rand()偏差?

我正在用C语言重写C中的蒙特卡罗模拟,以便在VBA / Excel的dll中使用。 计算中的“引擎”是创建0到10001之间的随机数,并与5000-7000邻域中的变量进行比较。 每次迭代使用4-800次,我使用100000次迭代。 因此,每次运行大约有50.000.000代随机数。 在Objective C中,测试表明没有偏见,我对C代码有很大的问题。 Objective C是C的超集,因此95%的代码都是复制粘贴,很难搞砸。 我昨天和今天整天经历了很多次,我没有发现任何问题。 我使用srand()留下了arc4random_uniform()和rand()之间的区别,特别是因为偏向0到10000的较低数字。我所进行的测试与.5的偏差是一致的。对于大约5000以下的数字,2%。任何其他解释是我的代码避免重复,我想它不会。 代码非常简单(“spiller1evne”和“spiller2evne”是5500到6500之间的数字): srand((unsigned)time(NULL)); for (j=0;j<antala;++j){ [..] for (i=1;i<450;i++){ chance = (rand() % 10001); [..] if (grey==1) { if (chance < spiller1evnea) vinder = 1; else vinder = 2; } else{ if (chance < spiller2evnea) vinder = 2; else vinder = 1; } 现在我不需要真正的随机性,伪随机性非常好。 我只需要在累积的基础上近似均匀分布(如果5555的可能性是5556的两倍并不重要。如果5500-5599的可能性为5600-5699并且可能性为5如果有明显的0.5-2%偏向0-4000而不是6000-9999。 […]