Ios 如果我在5o'时调用arc4random_uniform(6);时钟还是5:01,我能得到相同的号码吗?
我正在制作一款iOS骰子游戏,一位测试人员说他喜欢这样的想法,即掷骰子是预先确定的,因为我使用的是Ios 如果我在5o'时调用arc4random_uniform(6);时钟还是5:01,我能得到相同的号码吗?,ios,random,arc4random,Ios,Random,Arc4random,我正在制作一款iOS骰子游戏,一位测试人员说他喜欢这样的想法,即掷骰子是预先确定的,因为我使用的是arc4random\u uniform(6)。我不确定他们是不是。因此,撇开代码可能连续选择同一个数字的可能性不谈,如果我在5秒或10秒的时间内点击骰子,我会生成一个不同的数字吗?基本上,它是随机的。不,它不是以时间为基础的。苹果已经记录了这是如何随机的:基本上,这是随机的。不,它不是以时间为基础的。苹果在这里记录了这是如何随机的:您的测试人员可能认为软件随机数生成器实际上是伪随机的。它们的输出并
arc4random\u uniform(6)
。我不确定他们是不是。因此,撇开代码可能连续选择同一个数字的可能性不谈,如果我在5秒或10秒的时间内点击骰子,我会生成一个不同的数字吗?基本上,它是随机的。不,它不是以时间为基础的。苹果已经记录了这是如何随机的:基本上,这是随机的。不,它不是以时间为基础的。苹果在这里记录了这是如何随机的:您的测试人员可能认为软件随机数生成器实际上是伪随机的。它们的输出并不像压模辊那样是真正随机的物理过程:它是由生成器保持或给定的某种状态决定的
PRNG的一个简单实现是“线性同余生成器”:标准库中的函数rand()
使用此技术。它的核心是一个简单的数学函数,每个输出都是通过输入前一个来生成的。因此它需要一个“种子”值,这就是测试人员所想的--您得到的输出值序列完全由种子值决定
如果您使用rand()
创建一个简单的C程序,您可以(事实上必须)使用配套函数srand()
(即“seed rand”)为LCG提供一个起始值。如果使用一个常量作为种子值:srand(4)
,每次都将以相同的顺序从rand()
获得相同的值
获取任意--not random--seed forrand()
的一种常见方法是使用当前时间:srand(time(NULL))
。如果您这样做了,并以足够快的速度重新设定种子并生成了一个数字,time()
的返回值没有改变,那么您确实可以从rand()
中看到相同的输出
这不适用于arc4random()
:它不使用LCG,也不与rand()
共享此特性。它被认为是*;也就是说,它的输出与真实的物理随机性是无法区分的
这部分是因为arc4random()
arc4random()在您使用它时会重新对其进行种子设定,并且种子设定本身是基于操作系统收集的不可预测的数据。决定输出的状态完全在算法内部;作为普通用户(即,不是攻击者),您不会查看、设置或以其他方式与该状态交互
因此,您不能可靠地重复arc4random()
的输出。然而,可重复的伪随机算法确实存在,您当然可以使用它们进行测试
*Wikipedia指出,在过去几年中已经发现了一些弱点,它可能不再适用于加密技术。不过,只要不涉及任何金钱,这对你的游戏来说应该没问题 您的测试人员可能认为软件随机数生成器实际上是伪随机的。它们的输出并不像压模辊那样是真正随机的物理过程:它是由生成器保持或给定的某种状态决定的 PRNG的一个简单实现是“线性同余生成器”:标准库中的函数
rand()
使用此技术。它的核心是一个简单的数学函数,每个输出都是通过输入前一个来生成的。因此它需要一个“种子”值,这就是测试人员所想的--您得到的输出值序列完全由种子值决定
如果您使用rand()
创建一个简单的C程序,您可以(事实上必须)使用配套函数srand()
(即“seed rand”)为LCG提供一个起始值。如果使用一个常量作为种子值:srand(4)
,每次都将以相同的顺序从rand()
获得相同的值
获取任意--not random--seed forrand()
的一种常见方法是使用当前时间:srand(time(NULL))
。如果您这样做了,并以足够快的速度重新设定种子并生成了一个数字,time()
的返回值没有改变,那么您确实可以从rand()
中看到相同的输出
这不适用于arc4random()
:它不使用LCG,也不与rand()
共享此特性。它被认为是*;也就是说,它的输出与真实的物理随机性是无法区分的
这部分是因为arc4random()
arc4random()在您使用它时会重新对其进行种子设定,并且种子设定本身是基于操作系统收集的不可预测的数据。决定输出的状态完全在算法内部;作为普通用户(即,不是攻击者),您不会查看、设置或以其他方式与该状态交互
因此,您不能可靠地重复arc4random()
的输出。然而,可重复的伪随机算法确实存在,您当然可以使用它们进行测试
*Wikipedia指出,在过去几年中已经发现了一些弱点,它可能不再适用于加密技术。不过,只要不涉及任何金钱,这对你的游戏来说应该没问题 您尝试时发生了什么?arc4random_uniform是随机的。您是否在询问
arc4random
的随机性是否受到时钟的任何影响?换句话说,您是否想知道,为了讨论起见,如果您现在调用arc4random\u uniform(6)
,是否会得到4
的结果,但如果您在调用arc4random\u uniform(6)
之前多等了一分钟,可能会得到不同的结果