41

使用 arc4random() 时可以设置数字范围吗?仅例如 50-100。

4

6 回答 6

73

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

arc4random_uniform(4)

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

arc4random_uniform(51)

并且只需将 50 添加到结果中即可获得 50 和 100(含)之间的范围。

于 2010-08-06T03:16:04.517 回答
27

扩展 JohnK 的评论。

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

arc4random_uniform(51)

这将返回范围0为的随机数50

然后你可以像这样添加你的下界:

arc4random_uniform(51) + 50

这将返回范围50为的随机数100

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

arc4random_uniform(upper_bound) 将返回一个小于upper_bound 的均匀分布的随机数。建议使用 arc4random_uniform() 而非 ``arc4random() % upper_bound'' 之类的结构,因为当上限不是 2 的幂时,它可以避免“模偏差”。

简而言之,您会得到一个更均匀分布的随机数。

于 2013-12-18T23:20:40.203 回答
18
int fromNumber = 10;
int toNumber = 30;
int randomNumber = (arc4random()%(toNumber-fromNumber))+fromNumber;

会在andrandon number之间产生,即103011,12,13,14......29

于 2010-09-16T08:30:35.097 回答
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);
于 2015-04-13T08:20:04.010 回答
1

在 Swift 中,您可以使用它(灵感来自@Justyn的回答)

func generateRandomKey(fromRange rangeFrom:Int, toRange rangeTo:Int) -> Int{

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

总是会给你一个随机范围的整数。

于 2015-12-20T16:09:26.133 回答
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(含)。

于 2013-05-04T01:14:47.777 回答