Tag: arc4random

避免蒙特卡罗模拟中的基本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。 […]

消除模偏差:如何在arc4random_uniform()函数中实现?

模数偏差是在天真地使用模运算来获得小于给定“上限”的伪随机数时出现的问题。 因此,作为C程序员,我使用arc4random_uniform()函数的修改版本来生成均匀分布的伪随机数。 问题是我不明白这个函数是如何工作的,数学上。 这是函数的解释性注释,后跟完整源代码的链接: /* * Calculate a uniformly distributed random number less than upper_bound * avoiding “modulo bias”. * * Uniformity is achieved by generating new random numbers until the one * returned is outside the range [0, 2**32 % upper_bound). This * guarantees the selected random number will be inside * [2**32 % […]