假设我需要 [0, K) 范围内的 N 个加密安全伪随机整数。实现这一点的最明显方法是 N 调用arc4random_uniform(3)
,这正是我正在做的。
然而,分析器告诉我,无数次调用arc4random_uniform(3)
占用了整个执行时间的 2/3,我真的需要让我的代码更快。这就是为什么我计划提前生成一些随机字节(可能使用arc4random_buf(3)
),然后一点一点地从中提取。
对于 K = 2,我可以简单地将所需的位屏蔽掉,但是当 K 不是 2 的幂时,事情就会变得棘手。当然我可以使用一堆%=
and /=
,但是我会有模偏差。另一个问题是当 N 变得太大时,我不能再将整个缓冲区解释为整数并对其执行算术运算。
如果相关,K 将小于 20,而 N 可能非常大,例如数百万。