在两个浮点数之间生成随机浮点数

33

我知道这是一个相当简单的问题,但我不太擅长数学。

我知道如何生成一个介于0和1之间的随机浮点数:

float random = ((float) rand()) / (float) RAND_MAX;
  • 但是,如果我想要一个函数,在给定两个浮点数范围的情况下返回该范围内的伪随机浮点数呢?

例如:

RandomFloat( 0.78, 4.5 ); //Could return 2.4124, 0.99, 4.1, etc.

2
另外,如果可以的话,请优先使用double而不是float。 - Doug T.
2
可能是C++随机浮点数的重复问题。 - John Dibling
1
从C++11开始,您不应再以这种方式生成随机数。相反,请使用更安全和更方便的random模块。 - Alex
4个回答

38
float RandomFloat(float a, float b) {
    float random = ((float) rand()) / (float) RAND_MAX;
    float diff = b - a;
    float r = random * diff;
    return a + r;
}
这个代码通过返回 asomething 之和来工作,其中 something 的值在 0 和 b-a 之间,这使得最终结果介于 ab 之间。

@stefan 不需要,如果你添加了 fabsf,那么你还需要将最后一行改为 min(a,b) + r - Wim
2
现在的写法,如果 b < a,那么 diff < 0 并且 a + r 将会 < a - Wim
你说得对,只是有点混淆,1.0会使较低的值。 - stefan
1
这个“随机”的数字仍然具有与范围0-RAND_MAX中整数数量成比例的粒度。如何获得一个真正的随机浮点数? - Chris
RAND_MAX通常为2^31,因此它提供的随机位数比float的尾数中的位数更多。对于doubles,您可以使用drand48(),它提供0.0到1.0之间的double值(而不是上面的“random”),它有48个随机位,这更接近于(但仍然少于)double中的尾数位(52)。 - Wim
显示剩余2条评论

7
float RandomFloat(float min, float max)
{
    // this  function assumes max > min, you may want 
    // more robust error checking for a non-debug build
    assert(max > min); 
    float random = ((float) rand()) / (float) RAND_MAX;

    // generate (in your case) a float between 0 and (4.5-.78)
    // then add .78, giving you a float between .78 and 4.5
    float range = max - min;  
    return (random*range) + min;
}

@stefan,是的,你说得对。我错过了随机数的计算方式,并将其从0-RAND_MAX缩小。看起来我需要将其放大。 - Doug T.
最后一条语句缺少分号。 - Tommy
1
注意:从C++11开始,您不应再使用这种方式生成随机数。请改用更安全、更方便的random模块。 - Alex

1
随机生成两个浮点数之间的数字:
float    random_between_two_int(float min, float max)    
{    
    return (min + 1) + (((float) rand()) / (float) RAND_MAX) * (max - (min + 1));    
}

随机生成两个整数:
int    random_between_two_int(float min, float max)    
{    
    return rand() % (max - min) + min + 1;     
}

2
-1,因为考虑到C++标准库有更好的伪随机数生成,这个回答并没有提供任何有价值的内容。 - Bartek Banachewicz

1
假设您定义了MIN_RAND和MAX_RAND表示范围,那么您可以使用以下代码:
const float MIN_RAND = 2.0, MAX_RAND = 6.0;
const float range = MAX_RAND - MIN_RAND;
float random = range * ((((float) rand()) / (float) RAND_MAX)) + MIN_RAND ;

这将为您提供按照您选择的范围缩放后的数字。 MIN_RAND,MAX_RAND 可以是任何值,比如说 2.5、6.6。 因此,函数可以是这样的:
float RandomFloat(float min, float max) {
    return  (max - min) * ((((float) rand()) / (float) RAND_MAX)) + min ;
}

1
请使用C++11的随机数生成器。 - Étienne

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接