使用arc4random()时如何选择值范围

Nex*_*Rev 41 objective-c arc4random ios

使用arc4random()时可以设置一系列数字吗?例如仅50-100.

Run*_*oop 71

正如下面其他帖子所指出的,最好使用arc4random_uniform.(当这个答案最初编写时,arc4random_uniform不可用).除了避免模数偏差之外arc4random() % x,它还避免了arc4random在短时间帧内递归使用时的播种问题.

arc4random_uniform(4)
Run Code Online (Sandbox Code Playgroud)

将生成0,1,2或3.因此您可以使用:

arc4random_uniform(51)
Run Code Online (Sandbox Code Playgroud)

只需在结果中加50即可得到50到100(含)之间的范围.

  • 谨防这种方法的[modulo bias](http://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle#Modulo_bias).更安全地使用[`arc4random_uniform()`](http://stackoverflow.com/questions/648739/objective-c-modulo-bias). (7认同)
  • 比如Run Loop表示添加50. int num =(arc4random()%(51))+ 50; (2认同)

Jus*_*tyn 27

扩展JohnK评论.

建议您使用以下函数返回一个范围随机数:

arc4random_uniform(51)
Run Code Online (Sandbox Code Playgroud)

这将范围返回一个随机数050.

然后你可以添加你的下限,如:

arc4random_uniform(51) + 50
Run Code Online (Sandbox Code Playgroud)

这将范围返回一个随机数50100.

我们使用的原因arc4random_uniform(51)arc4random() % 51是为了避免模偏置.这在手册页中突出显示如下:

arc4random_uniform(upper_bound)将返回小于upper_bound的均匀分布的随机数.arc4random_uniform()建议使用像``arc4random()%upper_bound''这样的结构,因为当上限不是2的幂时,它避免了"模偏差".

简而言之,您可以生成更均匀分布的随机数.


Vai*_*ran 18

int fromNumber = 10;
int toNumber = 30;
int randomNumber = (arc4random()%(toNumber-fromNumber))+fromNumber;
Run Code Online (Sandbox Code Playgroud)

将产生和randon number之间,即103011,12,13,14......29

  • 它是(arc4random()%(toNumber-fromNumber + 1))+ fromNumber (7认同)
  • 谨防这种方法的[modulo bias](http://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle#Modulo_bias).更安全地使用[`arc4random_uniform()`](http://stackoverflow.com/questions/648739/objective-c-modulo-bias). (4认同)