【问题标题】:Why is arc4random returning negative numbers sometimes?为什么 arc4random 有时会返回负数?
【发布时间】:2012-08-26 19:18:40
【问题描述】:

我正在使用arc4random() 生成一定范围内的数字。但是,我会间歇性地收到负数。我没有做任何奇怪的事情:

if([aBug x] == -1) {
    x = arc4random() % columns;
}

if([aBug y] == -1) {
    y = arc4random() % rows;
}

在这里,x 和 y 有时会设置为负值。 x 和 y 都是 int 类型。

【问题讨论】:

  • 这里可能不重要,但一般建议使用arc4random_uniform(columns)。来自文档:arc4random_uniform() 建议在 arc4random() % upper_bound 之类的结构上使用,因为当上限不是 2 的幂时,它可以避免“模偏差”。

标签: objective-c gnustep arc4random


【解决方案1】:

听起来您想将 x 和 y 声明为 u_int32_t 而不是 int 类型。即,您应该使用无符号变量而不是有符号变量。

或者,使用大于 32 位的有符号整数(例如,uint64_t/long long)。

【讨论】:

  • 我基本上最终使用了NSUInteger,这似乎可行。感谢您为我指明正确的方向!
【解决方案2】:

因为arc4random() 总是积极的:

arc4random()函数返回0到(2**32)-1范围内的伪随机数

[Source]

我不得不推断columns 或rows 是“任意”否定的。用负数对正数进行模数将返回负数。

行和列的数据类型有哪些?

【讨论】:

  • 抱歉刚刚看到这个。看起来 SO 没有给我关于这个问题的答案的通知! columns 和 rows 都是 int 类型并且是正数。
【解决方案3】:

我遇到了同样的问题。我不知道为什么这解决了它,但改变了

(int)arc4Random()%4

到

(int)(arc4Random()%4)

似乎对我有用。

【讨论】:

    猜你喜欢
    • 2020-03-22
    • 2019-04-28
    • 1970-01-01
    • 2015-08-12
    • 2017-03-04
    • 1970-01-01
    • 2012-08-12
    • 1970-01-01
    • 2013-12-10
    相关资源
    最近更新 更多