在Objective-C中生成两个数之间的随机数

Dem*_*rpl 49 random objective-c arc4random

我有两个文本框,用户可以输入2个正整数(使用Objective-C).目标是在两个数字之间返回一个随机值.

我使用过"man arc4random",但仍然无法完全绕过它.我想出了一些代码,但它有问题.

float lowerBound = lowerBoundNumber.text.floatValue;
float upperBound = upperBoundNumber.text.floatValue;
float rndValue;
//if lower bound is lowerbound < higherbound else switch the two around before randomizing.
if(lowerBound < upperBound)
{
    rndValue = (((float)arc4random()/0x100000000)*((upperBound-lowerBound)+lowerBound));
}
else 
{
    rndValue = (((float)arc4random()/0x100000000)*((lowerBound-upperBound)+upperBound));
}
Run Code Online (Sandbox Code Playgroud)

现在,如果我输入值0和3,它似乎工作得很好.但是,如果我使用数字10和15,我仍然可以为"rndValue"获得低至1.0000000或2.000000的值.

我是否需要详细说明我的算法,还是需要更改使用arc4random的方式?

小智 122

你可以简单地使用这样的整数值:

int lowerBound = ...
int upperBound = ...
int rndValue = lowerBound + arc4random() % (upperBound - lowerBound);
Run Code Online (Sandbox Code Playgroud)

或者,如果你的意思是你想在lowerBound和upperBound之间包含浮点数?如果是这样,请参阅此问题:https://stackoverflow.com/a/4579457/1265516

  • 这将产生大于或等于`lowerBound`但小于(但不包括)`upperBound`的随机整数.如果你想在数字范围内包含`upperBound`,你需要`rndValue = lowerBound + arc4random()%(upperBound - lowerBound + 1)`.或者更好(消除模偏差),`rndValue = lowerBound + arc4random_uniform(upperBound - lowerBound + 1)`. (12认同)
  • 代码不包含upperBound作为随机输出,请参阅下面的答案作为修复. (2认同)

ine*_*cii 66

以下代码包括最小AND MAXIMUM值作为随机输出数:

- (NSInteger)randomNumberBetween:(NSInteger)min maxNumber:(NSInteger)max
{
    return min + arc4random_uniform((uint32_t)(max - min + 1));
}
Run Code Online (Sandbox Code Playgroud)

更新:
我通过更换编辑答案arc4random() % upper_boundarc4random_uniform(upper_bound)作为@rmaddy建议.
以下是arc4random_uniform的详细信息参考.

Update2:
我通过在arc4random_uniform()@bicycle指示的情况下向uint32_t插入一个强制转换来更新答案.

  • 使用`return arc4random_uniform(max - min + 1)+ min;`会更好. (6认同)
  • @Supertecnoboff 不是。请注意,自从我发表评论以来,答案已被编辑。过去建议使用“arc4random() % (max - min + 1)”的答案。我的评论建议使用 `arc4random_uniform(max - min + 1)`。 (2认同)
  • 这给烦人的隐式转换失去了整数精度警告.最好放一个演员:`return min + arc4random_uniform((uint32_t)(max - min + 1));` (2认同)

Abo*_*tef 7

-(int) generateRandomNumberWithlowerBound:(int)lowerBound
                               upperBound:(int)upperBound
{
    int rndValue = lowerBound + arc4random() % (upperBound - lowerBound);
    return rndValue;
}
Run Code Online (Sandbox Code Playgroud)