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
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_bound
与arc4random_uniform(upper_bound)
作为@rmaddy建议.
以下是arc4random_uniform的详细信息参考.
Update2:
我通过在arc4random_uniform()
@bicycle指示的情况下向uint32_t插入一个强制转换来更新答案.
-(int) generateRandomNumberWithlowerBound:(int)lowerBound
upperBound:(int)upperBound
{
int rndValue = lowerBound + arc4random() % (upperBound - lowerBound);
return rndValue;
}
Run Code Online (Sandbox Code Playgroud)