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

时间:2012-03-13 04:28:01

标签: objective-c random 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));
}

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

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

6 个答案:

答案 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))

试试这个。