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

42

我在使用arc4random()函数时,能否设置一个数字范围?比如只生成50到100之间的随机数。


使用模数运算来确定范围,并将偏移量加到其中,例如 arc4random() % 50 + 50; 这将为您提供一个在 50 到 99 范围内的随机数。 - holex
6个回答

73

正如以下其他帖子所指出的那样,最好使用arc4random_uniform。(当撰写此答案时,arc4random_uniform尚不可用)。除了避免arc4random() % x的模数偏差之外,它还避免了在短时间内递归使用arc4random时出现的种子问题。

arc4random_uniform(4)

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

arc4random_uniform(51)

只需将结果加50即可得到50至100(包括100)之间的范围。


这只给你0到50,没有给你50到100的范围。 - Boon
2
就像Run Loop所说的那样,加上50。int num = (arc4random() % (51)) +50; - Nungster
7
注意此方法可能存在取模偏差。更安全的选择是使用arc4random_uniform() - JohnK
我在下面的回答中扩展了@JohnK的想法。如果你想要一个更准确的随机数分布,那么绝对值得考虑一下。 - Justyn

29

为了进一步解释JohnK的评论。

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

arc4random_uniform(51)

这个函数会返回一个在 050 范围内的随机数。

然后你可以添加你所需要的下限值,例如:

arc4random_uniform(51) + 50

该函数将返回在范围 50100 内的随机数。

我们使用 arc4random_uniform(51) 而不是 arc4random() % 51 是为了避免出现模数偏差。这在文档中有如下说明:

arc4random_uniform(upper_bound) 将返回一个小于 upper_bound 的均匀分布的随机数。与“arc4random() % upper_bound”等构造相比,建议使用 arc4random_uniform(),因为它在上限不是2的幂时可以避免“模数偏差”。

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


18
int fromNumber = 10;
int toNumber = 30;
int randomNumber = (arc4random()%(toNumber-fromNumber))+fromNumber;

将生成1030之间的随机数,例如11,12,13,14......29


7
这句话的意思是:在[fromNumber, toNumber]范围内随机生成一个整数。可以将其翻译为:It's (arc4random()%(toNumber-fromNumber+1))+fromNumber。意思是:在[fromNumber,toNumber]范围内随机生成一个整数。 - Michaël
4
注意避免使用此方法造成的模数偏差,建议改用arc4random_uniform()更为安全。 - JohnK

3
你可以使用此代码生成指定范围内的随机值:
//range from 50 to 100
int num1 = (arc4random() % 50) + 50; or
int num1 = arc4random_uniform(50) + 50;

//range from 0-100
int num1 = arc4random() % 100; or
int num1 = arc4random_uniform(100);

1
在Swift中,您可以使用以下内容(受@Justyn答案的启发)
func generateRandomKey(fromRange rangeFrom:Int, toRange rangeTo:Int) -> Int{

    let theKey = arc4random_uniform(UInt32(rangeTo - rangeFrom)) +  UInt32(rangeFrom)
    return Int(theKey)
}

将始终为您提供随机范围整数。


我认为这需要调整,因为您的范围始终比您想要的少1。您应该将rangeTo增加1。“让theKey = arc4random_uniform(UInt32((rangeTo + 1) - rangeFrom)) + UInt32(rangeFrom)” - Justyn
另外,如果你想要生成一个随机密钥,你应该看看这个链接:https://dev59.com/FGAf5IYBdhLWcg3wo0Bn#24428458 - Justyn

0
在许多情况下,10到30意味着包括两个数(包括10和30)...
int fromNumber = 10;
int toNumber = 30;
toNumber ++;
int randomNumber = (arc4random()%(toNumber-fromNumber))+fromNumber;

注意 toNumber 和 fromNumber 的差异,现在是 21 ...(20 + 1),这将产生 0 到 20(包括)的可能结果,当加上 fromNumber(10)时,结果为 10 到 30(包括)。

2
注意此方法的模数偏差。更安全的方法是使用arc4random_uniform() - JohnK

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接