任何人都可以解释"arc4random()"方法是如何工作的?

Shr*_*oni -1 objective-c

任何人都可以解释"arc4random()"方法如何在内部工作?

我的代码在这里:

randomDataName.derivation = [derivationArray objectAtIndex:(arc4random() %derivationCount)];
randomDataName.icon = [iconArray objectAtIndex:(arc4random() % iconCount)];
randomDataName.notes = [notesArray objectAtIndex:(arc4random() % notesCount)];
Run Code Online (Sandbox Code Playgroud)

Jes*_*ese 10

arc4random使用Rivest Cipher 4.它是一个替代密码,就像最粗糙的Caesear Cipher.而对于替换,它使用S-box,它显然作为替换框扩展.简单来说,S-Box可以被称为查找表,您可以在其中查找字节的替换.阅读有关S-box的更多信息.

一个S-Box

在这里,S-Box可以处于2 ^ 1700个不同的状态(简单来说,它可以提供多个变量替换查找表,通常可以衡量密码强度.).整个过程产生伪随机数,这意味着数字不是真正随机的(我不确定是否实现了真正的随机数生成.),即数量将取决于确定性的东西.该功能可以为您提供0-4294967296范围内的任何数字.

那它有什么优势超过正常rand()random()?它有更高的范围(希望,比这两个更随机).但是,如果你使用一个小的随机数,优势就会减少,我看到你正在这样做.

[derivationArray objectAtIndex:(arc4random() %derivationCount)]
Run Code Online (Sandbox Code Playgroud)

因此,通过以模数除以arc4random()输出,您将最终结果限制为0 - derivationCount的范围.

并且有很多解释!但是如果你只是想要功能定义,请阅读手册!.

从评论中编辑:

而不是模偏差,使用arc4random_uniform().仍然无法保证数字不会重复.

  • 请注意:您永远不想使用`arc4random()`和%来限制范围.这引入了模偏差(某些值比其他值更可能).相反,大多数具有`arc4random()`的系统也具有`arc4random_uniform()`,它可以在不引入偏差的情况下实现相同的目标. (4认同)