3

我在我的 iOS 应用程序的一个函数中调用 arc4random 来生成从 -5 到 6 的随机值。

double num;
for (int i = 0; i < 3; i++) {
    num = (arc4random() % 11) - 5;
    NSLog(@"%0.0f", num);
}

我从控制台得到以下输出。

2012-05-01 20:25:41.120 Project32[8331:fb03] 0
2012-05-01 20:25:41.121 Project32[8331:fb03] 1
2012-05-01 20:25:41.122 Project32[8331:fb03] 4294967295

0 和 1 是范围内的值,但是哇,4294967295 是从哪里来的?

更改arc4random()rand()解决问题,但是rand(),当然,需要播种。

4

2 回答 2

7

arc4random()返回一个u_int32_t-- 这是一个无符号整数,不代表负值。每次arc4random() % 11得出一个数字 0 ≤ n < 5,你减去 5 并环绕到一个非常大的数字。

double当然, s可以表示负数,但你不会转换为,double直到为时已晚。在里面放一个演员表:

 num = (double)(arc4random() % 11) - 5;

在减法之前提升模的结果,一切都会好起来的。

于 2012-05-02T00:48:22.483 回答
4

尝试使用

arc4random_uniform(11) - 5;

反而。

从手册页:

arc4random_uniform() will return a uniformly distributed random number
 less than upper_bound.  arc4random_uniform() is recommended over con-
 structions like ``arc4random() % upper_bound'' as it avoids "modulo bias"
 when the upper bound is not a power of two.
于 2012-05-02T00:32:40.797 回答