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

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

我用“男人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,我仍然可以获得低至1.0000000或2.000000的“rndValue”。

我是否需要详细说明algorithm,还是需要改变我使用arc4random的方式?

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

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

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

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

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

更新:
我编辑答案通过replacearc4random() % upper_boundarc4random_uniform(upper_bound)为@rmaddybuild议。
这里是arc4random_uniform的细节的参考。

UPDATE2:
我更新了答案,通过在arc4random_uniform()插入一个arc4random_uniform()为uint32_t来表示@bicycle。

 -(int) generateRandomNumberWithlowerBound:(int)lowerBound upperBound:(int)upperBound { int rndValue = lowerBound + arc4random() % (upperBound - lowerBound); return rndValue; } 

如果可以的话,应该避免使用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))乘以随机浮点数,实际上它等于upperBound。 这就是为什么你仍然得到的结果低于你预期的下限。