为什么arc4random会返回异乎寻常的价值?

时间:2012-05-02 00:29:01

标签: objective-c

我在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是范围内的值,但是wowww,4294967295来自哪里?

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

2 个答案:

答案 0 :(得分:7)

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

当然,

double 可以代表负数,但是你不会转换为double,直到为时已晚。在那里贴一个演员:

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

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

答案 1 :(得分: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.