53

我有两个文本框,用户可以输入 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));
}

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

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

4

6 回答 6

126

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

int lowerBound = ...
int upperBound = ...
int rndValue = lowerBound + arc4random() % (upperBound - lowerBound);

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

于 2012-03-13T04:34:22.353 回答
70

以下代码包括作为随机输出数的最小值和最大值:

- (NSInteger)randomNumberBetween:(NSInteger)min maxNumber:(NSInteger)max
{
    return min + arc4random_uniform((uint32_t)(max - min + 1));
}

更新:我按照@rmaddy 的建议
替换了答案arc4random() % upper_bound。 这里是arc4random_uniform的参考资料。arc4random_uniform(upper_bound)

更新2 :我通过在@bicycle
中插入一个强制转换为uint32_t 来更新答案。arc4random_uniform()

于 2013-12-11T07:36:36.833 回答
7
-(int) generateRandomNumberWithlowerBound:(int)lowerBound
                               upperBound:(int)upperBound
{
    int rndValue = lowerBound + arc4random() % (upperBound - lowerBound);
    return rndValue;
}
于 2014-10-16T12:00:18.637 回答
2

如果可以,您应该避免使用 mod (%) 钳位值,因为即使您使用的伪随机数生成器(如arc4random)擅长在其整个范围内提供均匀分布的数字,它也可能无法在受限的模数范围。

你也不需要使用像这样的文字,0x100000000因为 stdint.h 中有一个方便的常量:

(float)arc4random() / UINT32_MAX

这将为您提供区间 [0,1] 内的随机浮点数。请注意,它arc4random返回区间 [0, 2**32 - 1] 中的整数。

要将其移至所需的间隔,只需添加最小值并将随机浮点数乘以范围的大小:

lowerBound + ((float)arc4random() / UINT32_MAX) * (upperBound - lowerBound);

在您发布的代码中,您将随机浮点数乘以整个混乱(lowerBound +(upperBound - lowerBound)),这实际上等于上界。这就是为什么您仍然获得低于预期下限的结果的原因。

于 2014-07-19T02:50:35.330 回答
1

Objective-C 函数

-(int)getRandomNumberBetween:(int)from to:(int)to
{
    return (int)from + arc4random() % (to-from+1);
}

迅速:

func getRandomNumberBetween(_ from: Int, to: Int) -> Int 
{
    return Int(from) + arc4random() % (to - from + 1)
}

通过以下方式在任何地方调用它

int OTP = [self getRandomNumberBetween:10 to:99];
NSLog(@"OTP IS %ld",(long)OTP);
NSLog(@"OTP IS %@",[NSString stringWithFormat @"%ld",(long)OTP]);

对于斯威夫特:

var OTP: Int = getRandomNumberBetween(10, to: 99)
于 2017-12-28T12:21:20.707 回答
0

在斯威夫特:

let otp = Int(arc4random_uniform(6))

尝试这个。

于 2018-01-24T08:14:05.930 回答