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

发布于 2024-09-13 07:02:12 字数 45 浏览 3 评论 0原文

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

Can I set a range of numbers when using arc4random()? For example 50-100 only.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(6

橘虞初梦 2024-09-20 07:02:12

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

arc4random_uniform(4)

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

arc4random_uniform(51)

并只需在结果中添加 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 of arc4random() % x, it also avoids a seeding problem with arc4random when used recursively in short timeframes.

arc4random_uniform(4)

will generate 0, 1, 2 or 3. Thus you could use:

arc4random_uniform(51)

and merely add 50 to the result to get a range between 50 & 100 (inclusive).

燕归巢 2024-09-20 07:02:12

扩展 JohnK 的评论。

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

arc4random_uniform(51)

它将返回 050 范围内的随机数。

然后您可以添加下限,如下所示:

arc4random_uniform(51) + 50

这将返回 50100 范围内的随机数。

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

arc4random_uniform(upper_bound) 将返回小于 upper_bound 的均匀分布随机数。推荐使用 arc4random_uniform() 而不是像“arc4random() % upper_bound”这样的结构,因为当上限不是 2 的幂时,它可以避免“模偏差”。

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

To expand upon JohnK comment.

It is suggested that you use the following function to return a ranged random number:

arc4random_uniform(51)

which will return a random number in the range 0 to 50.

Then you can add your lower bounds to this like:

arc4random_uniform(51) + 50

which will return a random number in the range 50 to 100.

The reason we use arc4random_uniform(51) over arc4random() % 51 is to avoid the modulo bias. This is highlighted in the man page as follows:

arc4random_uniform(upper_bound) will return a uniformly distributed random number less than upper_bound. arc4random_uniform() is recommended over constructions like ``arc4random() % upper_bound'' as it avoids "modulo bias" when the upper bound is not a power of two.

In short you get a more evenly distributed random number generated.

南街女流氓 2024-09-20 07:02:12
int fromNumber = 10;
int toNumber = 30;
int randomNumber = (arc4random()%(toNumber-fromNumber))+fromNumber;

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

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

Will generate randon number between 10 and 30, i.e. 11,12,13,14......29

听风吹 2024-09-20 07:02:12

您可以使用此代码生成具有范围的随机值:

//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);

You can use this code for generating random values with range:

//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);
错爱 2024-09-20 07:02:12

在 Swift 中,你可以使用这个(受到 @Justyn 的回答的启发)

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

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

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

In Swift you can use this (inspired by answer of @Justyn)

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

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

Will always give you a random range Integer.

属性 2024-09-20 07:02:12

在许多情况下,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(含)。

In many situations 10 thru 30 would mean inclusive, (includes 10 and 30) ...

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

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).

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文