我有两个文本框,用户可以输入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的方式?
答案 0 :(得分:121)
你可以简单地使用这样的整数值:
int lowerBound = ...
int upperBound = ...
int rndValue = lowerBound + arc4random() % (upperBound - lowerBound);
或者,如果您的意思是想在lowerBound和upperBound之间包含浮点数?如果是这样,请参阅此问题:https://stackoverflow.com/a/4579457/1265516
答案 1 :(得分:65)
以下代码包含最小 AND MAXIMUM 值作为随机输出数字:
- (NSInteger)randomNumberBetween:(NSInteger)min maxNumber:(NSInteger)max
{
return min + arc4random_uniform((uint32_t)(max - min + 1));
}
更新:
我编辑了答案,将arc4random() % upper_bound
替换为arc4random_uniform(upper_bound)
作为@rmaddy建议
以下是arc4random_uniform的详细信息。
UPDATE2:
我通过在arc4random_uniform()
中插入uint32_t作为@bicycle指示来更新答案。
答案 2 :(得分:7)
-(int) generateRandomNumberWithlowerBound:(int)lowerBound
upperBound:(int)upperBound
{
int rndValue = lowerBound + arc4random() % (upperBound - lowerBound);
return rndValue;
}
答案 3 :(得分: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)),实际上只等于upperBound。这就是为什么你仍然得到的结果低于预期的下限。
答案 4 :(得分:0)
Objective-C功能:
activeUser
斯威夫特:
<fo:block>
<fo:table border-style="none" border-width="0pt">
<fo:table-column column-width="20%"/>
<fo:table-column column-width="80%"/>
<fo:table-body>
<fo:table-row>
<fo:table-cell border-style="solid" border-width="1pt" text-align="start" padding-left="0cm">
<fo:block font-weight="bold">First Column <xsl:text> </xsl:text> <xsl:number level="multiple" count="d:appnote" format="1"/>
</fo:block>
</fo:table-cell>
<fo:table-cell border-style="solid" border-width="1pt" text-align="start">
<fo:block><xsl:value-of select="d:description" /></fo:block>
</fo:table-cell>
</fo:table-row>
</fo:table-body>
</fo:table>
</fo:block>
通过:
随处调用-(int)getRandomNumberBetween:(int)from to:(int)to
{
return (int)from + arc4random() % (to-from+1);
}
对于Swift:
func getRandomNumberBetween(_ from: Int, to: Int) -> Int
{
return Int(from) + arc4random() % (to - from + 1)
}
答案 5 :(得分:0)
在Swift中:
let otp = Int(arc4random_uniform(6))
试试这个。