使用arc4random随机化float?

Sim*_*iwi 2 random objective-c ios

我有一个浮点数,我试图得到一个介于1.5 - 2之间的随机数.我在网上看过教程,但是在我的情况下,所有这些都是0到数字而不是1.5的随机化.我知道这是可能的,但我一直在摸索如何实现这一目标.谁能帮我?

Edit1:我在网上找到了以下方法,但我不想要所有这些小数位.我只想要5.2或7.4之类的东西......

我该如何调整这种方法来做到这一点?

-(float)randomFloatBetween:(float)num1 andLargerFloat:(float)num2
{
    int startVal = num1*10000;
    int endVal = num2*10000; 

    int randomValue = startVal + (arc4random() % (endVal - startVal));
    float a = randomValue;

    return (a / 10000.0);
}
Run Code Online (Sandbox Code Playgroud)

Edit2:好的,现在我的方法是这样的:

-(float)randomFloatBetween:(float)num1 andLargerFloat:(float)num2
{
    float range = num2 - num1;
    float val = ((float)arc4random() / ARC4RANDOM_MAX) * range + num1;
    return val;
}
Run Code Online (Sandbox Code Playgroud)

这会产生像1.624566等数字吗?因为我只想说1.5,1.6,1.7,1.8,1.9和2.0.

Luk*_*uke 10

您可以生成从0到0.5的随机浮点数并添加1.5.

编辑:

你走在正确的轨道上.我会使用可能的最大随机值作为你的除数,以便在可能的值之间得到最小的间隔,而不是你所进行的任意除法.所以,将arc4random()的最大值定义为宏(我刚刚在网上找到):

#define ARC4RANDOM_MAX      0x100000000
Run Code Online (Sandbox Code Playgroud)

然后得到1.5到2.0之间的值:

float range = num2 - num1;
float val = ((float)arc4random() / ARC4RANDOM_MAX) * range + num1;
return val;
Run Code Online (Sandbox Code Playgroud)

如果你需要它,这也会给你双精度(只需替换floatdouble.)

再次编辑:

是的,当然这会给你带有多个小数位的值.如果你只想要一个,只需产生一个从15到20的随机整数除以10.或者你可以随后砍掉额外的位置:

float range = num2 - num1;
float val = ((float)arc4random() / ARC4RANDOM_MAX) * range + num1;
int val1 = val * 10;
float val2= (float)val1 / 10.0f;
return val2;
Run Code Online (Sandbox Code Playgroud)

  • 而不是使用上面的#define,因为arc4random和arc4random_uniform都接受并给出了u_int32_t,使用stdint.h中定义的UINT32_MAX不是更合适吗?在我的Mac上,10.8.3它定义为4294967295U,但我相信0x100000000是4294967296所以这似乎是溢出的可能性不是吗? (4认同)

bob*_*obo 9

arc4random是一个32位发生器.它生成了Uint32.最大值arc4random()UINT_MAX.(不要使用ULONG_MAX!)

最简单的方法是:

// Generates a random float between 0 and 1
inline float randFloat()
{
  return (float)arc4random() / UINT_MAX ;
}

// Generates a random float between imin and imax
inline float randFloat( float imin, float imax )
{
  return imin + (imax-imin)*randFloat() ;
}

// between low and (high-1)
inline float randInt( int low, int high )
{
  return low + arc4random() % (high-low) ; // Do not talk to me
  // about "modulo bias" unless you're writing a casino generator
  // or if the "range" between high and low is around 1 million.
}
Run Code Online (Sandbox Code Playgroud)