使用arc4random随机化float?

时间:2011-11-09 05:31:04

标签: objective-c ios random

我有一个浮点数,我试图得到一个介于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);
}

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

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

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

5 个答案:

答案 0 :(得分:10)

你可以产生一个从0到0.5的随机浮点数并加1.5。

修改

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

#define ARC4RANDOM_MAX      0x100000000

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

float range = num2 - num1;
float val = ((float)arc4random() / ARC4RANDOM_MAX) * range + num1;
return val;

如果需要,这也会为您提供双精度(只需将float替换为double。)

再次编辑:

是的,当然这会给你带有多个小数位的值。如果你只想要一个,只需产生一个从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;

答案 1 :(得分: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.
}

答案 2 :(得分:2)

这应该适合你:

float mon_rand() {
  const u_int32_t r = arc4random();
  const double Min = 1.5;

  if (0 != r) {
    const double rUInt32Max = 1.0 / UINT32_MAX;
    const double dr = (double)r;
    /* 0...1 */
    const double nr = dr * rUInt32Max;
    /* 0...0.5 */
    const double h = nr * 0.5;
    const double result = Min + h;
    return (float)result;
  }
  else {
    return (float)Min;
  }
}

答案 3 :(得分:0)

这是我能想到的最简单的,当我遇到同样的“问题”时,它对我有用:

// For values from 0.0 to 1.0
float n;

n = (float)((arc4random() % 11) * 0.1);

在你的情况下,从1.5到2.0:

float n;

n = (float)((arc4random() % 6) * 0.1);
n += 15 * 0.1;

答案 4 :(得分:0)

对于想要更多数字的人:

如果您只想要浮动而不是arc4random(3),那么使用rand48(3)会更容易:

// Seed (only once)
srand48(arc4random()); // or time(NULL) as seed

double x = drand48();
  

drand48()erand48()函数返回非负,双精度浮点值,均匀分布在区间[0.0,1.0]上。

取自this answer