我在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()
当然需要播种。
答案 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.