本月初,Robert Clausecker替换了 FreeBSD
的arc4random_uniform(3)。arc4random_uniform(3)是arc4random(3)之上封装的一个生成一个较小范围伪随机数的函数。arc4random(3)采用密码学安全的伪随机数生成一个在 32-bit 范围,即 \([0,\ 2^{32}-1] \) 内均匀分布的伪随机整数,
此处的随机分布是依靠对称加密算法(目前采用的是 Chacha20)中用于实现加密的伪随机置换(Pseudorandom
Permutation)来保证的。伪随机数满足均匀分布是许多应用场景中需要的。举例来说,如果模拟掷骰子,我们一定是希望骰子六个面出现的概率基本相同。
注意到 \(2 ^ {32} \) 并不能被 6 整除,直接将arc4random(3)取模,或:arc4random() % 6得到的并不是我们所希望的[0, 5]范围内的均匀分布的随机数,因为arc4random()有可能返回[4294967292, 4294967295]这几个数,从而使得结果中 0, 1, 2, 3 这四个数出现的概率略微比 4 和 5 高一些。为了使 0, 1, 2, 3 这几个数字不要出现的概率比其他数字多,我们可以在样本中直接剔除掉开始或结束的这一段产生
0, 1, 2, 3 这几个在样本空间中多出现过一次的数字的
...
继续阅读
(4)