objective-c - 为什么 arc4random 会返回奇怪的值?

标签 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 是范围内的值,但是哇哦,4294967295 是从哪里来的?

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

最佳答案

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

double当然可以表示负数,但是您要等到为时已晚才能转换为double。在那里打一个石膏:

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

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

关于objective-c - 为什么 arc4random 会返回奇怪的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10406216/

相关文章:

iOS 8 UIView 没有得到更新的问题

objective-c - 使用 cocoa 在 nstable View 中显示水平网格线

ios - 动态 View 的自动布局约束

ios rectOfInterest AVCaptureMetadataOutput 忽略

Objective-C 实例变量/属性的多重声明

objective-c - 在 iOS 中以编程方式实例化类

ios - ReactiveCocoa subscribeNext 没有检查

ios - Xcode 5,动态原型(prototype)的自定义 UITableViewCell 类

iOS Core Data 获取新插入的、尚未保存的对象

objective-c - 当使用 `-popUpMenuPositioningItem:atLocation:inView:` 以编程方式将菜单附加到按钮时,如何获取选定的菜单项?