ios - 为什么 arc4random() 在将其存储在变量中时表现不同?

标签 ios objective-c

    int chance = -5;
    int rand = arc4random() % 100;   // Number from 0 to 99
    if (rand <= chance) {            // This will never happen
        NSLog(@"This is... NOT POSSIBLE");
    }

实际上,这永远不会发生。但是

    int chance = -5;
    if (arc4random() % 100 <= chance) {
        NSLog(@"This is... NOT POSSIBLE");
    }

在这里,我没有将它存储在变量中,而是将随机数表达式直接放在了条件中。并且满足条件(有时)。

这是为什么呢?如何调试此行为?

最佳答案

键入促销规则。

arc4random 返回一个unsigned 值。这意味着在您的第二种情况下,-5 被提升为相同的无符号类型,将其转换为 4294967291。 4+十亿绝对比0-99的任何数字都大!

让我们来看看您的两个示例中发生了什么。

  1. 从您的第一个示例开始,在这一行中:

    int rand = arc4random() % 100;
    

    arc4random() 返回一个无符号值。那么它看起来像:

    int rand = someUnsignedNumber % 100;
    

    100 是一个带符号的 int,因此它被提升为与 someUnsignedNumber 相同的类型,并应用 % 操作。之后你有:

    int rand = someUnsignedNumberBetween0And99;
    

    将该无符号数分配给 int rand 使其变回有符号数。然后您的比较会按预期进行。

  2. 在第二个例子中,你有这一行:

    if (arc4random() % 100 <= chance)
    

    arc4random() % 100 也会发生同样的事情,产生如下内容:

    if (someUnsignedNumberBetween0And99 <= chance)
    

    但是在这里,chance 是一个带符号的数字。它得到提升,如上所述改变它的值,你最终会看到你所看到的奇怪行为。

关于ios - 为什么 arc4random() 在将其存储在变量中时表现不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15120069/

相关文章:

ios - UICollectionView 单元格布局不重置以前设置的边框

ios - 为什么在一个新的 react-native 项目之后会有很多弃用警告?

objective-c - Objective C 中硬编码字节的奇怪结果

ios - 使用多个自定义 UITableViewCells

iphone - 将UITableView变成UIImageView

iphone - 适用于 ios 的 360° 全景库

ios - pushViewController 和 addSubview 有什么区别

ios - 如何重新设置字典的用户默认值

iphone - 重新加载 UITableView 数据而不重新加载 View ?

iphone - 数组中的对象数组通过测试