使用 arc4random() 时如何选择值范围
使用 arc4random() 时可以设置数字范围吗?例如仅 50-100。
Can I set a range of numbers when using arc4random()? For example 50-100 only.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
正如下面其他帖子所指出的,最好使用 arc4random_uniform。 (最初编写此答案时,
arc4random_uniform
不可用)。除了避免 arc4random() % x 的模偏差之外,它还避免了在短时间范围内递归使用时 arc4random 的播种问题。将生成 0、1、2 或 3。因此您可以使用:
并只需在结果中添加 50 即可获得 50 和 50 之间的范围。 100(含)。
As pointed out in other posts below, it is better to use
arc4random_uniform
. (When this answer was originally written,arc4random_uniform
was not available). Besides avoiding the modulo bias ofarc4random() % x
, it also avoids a seeding problem witharc4random
when used recursively in short timeframes.will generate 0, 1, 2 or 3. Thus you could use:
and merely add 50 to the result to get a range between 50 & 100 (inclusive).
扩展 JohnK 的评论。
建议您使用以下函数返回范围随机数:
它将返回
0
到50
范围内的随机数。然后您可以添加下限,如下所示:
这将返回
50
到100
范围内的随机数。我们使用
arc4random_uniform(51)
而不是arc4random() % 51
的原因是为了避免 模偏差。这在手册页中突出显示如下:简而言之,您会生成一个分布更均匀的随机数。
To expand upon JohnK comment.
It is suggested that you use the following function to return a ranged random number:
which will return a random number in the range
0
to50
.Then you can add your lower bounds to this like:
which will return a random number in the range
50
to100
.The reason we use
arc4random_uniform(51)
overarc4random() % 51
is to avoid the modulo bias. This is highlighted in the man page as follows:In short you get a more evenly distributed random number generated.
将生成
10
和30
之间的随机数
,即11,12,13,14......29
Will generate
randon number
between10
and30
, i.e.11,12,13,14......29
您可以使用此代码生成具有范围的随机值:
You can use this code for generating random values with range:
在 Swift 中,你可以使用这个(受到 @Justyn 的回答的启发)
总会给你一个随机范围的整数。
In Swift you can use this (inspired by answer of @Justyn)
Will always give you a random range Integer.
在许多情况下,10 到 30 意味着包含在内,(包括 10 和 30)...
请注意 toNumber - fromNumber 现在的区别是 21 ...(20+1),这会产生 0 到 20(包含)的可能结果,当添加到 fromNumber (10) 将得到 10 到 30(含)。
In many situations 10 thru 30 would mean inclusive, (includes 10 and 30) ...
Notice the difference toNumber - fromNumber is now 21 ... (20+1) which yields the possible results of 0 thru 20 (inclusive) which when added to fromNumber (10) results in 10 thru 30 (inclusive).