我有一个浮点数,我试图得到一个介于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。
答案 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。