如何在C语言中生成随机浮点数

如何在C语言中生成随机浮点数,c,random,floating-point,C,Random,Floating Point,我找不到任何解决方案来生成[0,a]范围内的随机浮点数,其中a是用户定义的某个浮点数 我试过以下方法,但似乎不能正常工作 float x=(float)rand()/((float)RAND_MAX/a) 这将在两个浮动之间生成一个随机浮动 float RandomFloat(float min, float max){ return ((max - min) * ((float)rand() / RAND_MAX)) + min; } 尝试: 要理解这是如何工作的,请考虑以下内容:

我找不到任何解决方案来生成
[0,a]
范围内的随机浮点数,其中
a
是用户定义的某个浮点数

我试过以下方法,但似乎不能正常工作

float x=(float)rand()/((float)RAND_MAX/a)

这将在两个浮动之间生成一个随机浮动

float RandomFloat(float min, float max){
   return ((max - min) * ((float)rand() / RAND_MAX)) + min;
}
尝试:

要理解这是如何工作的,请考虑以下内容:

N = a random value in [0..RAND_MAX] inclusively.
上述等式(为清晰起见,移除铸件)变为:

但是除以分数等于乘以分数的倒数,所以这等于:

N * (a/RAND_MAX)
可重写为:

a * (N/RAND_MAX)
考虑到
N/RAND_MAX
始终是介于0.0和1.0之间的浮点值,这将生成介于0.0和
a
之间的值

或者,您可以使用下面的方法,它有效地完成了我上面显示的分解。事实上,我更喜欢这样做,因为它更清楚(无论如何,对我来说)实际发生了什么:

注意:
a
的浮点表示必须精确,否则这将永远不会影响
a
的绝对边缘(它将接近)。有关原因的详细信息,请参阅

样本

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(int argc, char *argv[])
{
    srand((unsigned int)time(NULL));

    float a = 5.0;
    for (int i=0;i<20;i++)
        printf("%f\n", ((float)rand()/(float)(RAND_MAX)) * a);
    return 0;
}
-------------------------------------------
     From    |    Result    |      To
-------------------------------------------
  -10.000000 |     2.330828 |    10.000000
   -5.000000 |    -4.945523 |     5.000000
   -1.000000 |     0.004242 |     1.000000
   -0.250000 |    -0.203197 |    -0.150000
    1.500000 |     1.513431 |     1.520000
-1700.000000 |  3292.941895 |  8000.000000
   -0.100000 |    -0.021541 |     0.100000
   -1.000000 |    -0.148299 |     0.000000
   -1.000000 |     0.000000 |    -2.000000
    1.200000 |     0.000000 |     1.100000
-------------------------------------------

如果要在某个范围内生成随机浮点,请尝试下一个解决方案

#include <stdio.h>
#include <stdlib.h>
#include <time.h>


float
random_float(const float min, const float max)
{
    if (max == min) return min;
    else if (min < max) return (max - min) * ((float)rand() / RAND_MAX) + min;

    // return 0 if min > max
    return 0;
}


int
main (const int argc, const char *argv[])
{
    srand(time(NULL));

    char line[] = "-------------------------------------------";

    float data[10][2] = {
        {-10, 10},
        {-5., 5},
        {-1, 1},
        {-0.25, -0.15},
        {1.5, 1.52},
        {-1700, 8000},
        {-0.1, 0.1},
        {-1, 0},
        {-1, -2},
        {1.2, 1.1}
    };

    puts(line);
    puts("     From    |    Result    |      To");
    puts(line);


    int i;
    for (i = 0; i < 10; ++i) {
        printf("%12f | %12f | %12f\n", data[i][0], random_float(data[i][0], data[i][1]), data[i][1]);
    }

    puts(line);

    return 0;
}

您还可以在[min,max]范围内生成

float float_rand( float min, float max )
{
    float scale = rand() / (float) RAND_MAX; /* [0, 1.0] */
    return min + scale * ( max - min );      /* [min, max] */
}

虽然现在可能无关紧要,但这里有一个函数,它在两个值之间生成一个浮点值

#include <math.h>

float func_Uniform(float left, float right) {
    float randomNumber = sin(rand() * rand());
    return left + (right - left) * fabs(randomNumber);
}
#包括
浮动函数均匀(左浮动、右浮动){
浮点随机数=sin(rand()*rand());
返回左+(右-左)*晶圆厂(随机数);
}

谢谢。应该是:浮点x=(浮点)RAND()((浮点)RANDMAX/A)还是浮点X =(浮点)RAND()((浮点)RANDYMAX/A+ 1)投票重开,作为2 C++ 1)聚焦于随机整数。可能的RESUP NOPE副本,该链接刚刚返回这里:- DThis可能有非常坏的舍入属性。rand()返回一个32位int,将其转换为32位浮点,这将导致值被量化。例如,您获得值1000000192的可能性是值1的64倍,因为从1000000161到1000000223到1000000192。你可以通过使用双精度来避免这种情况,然后在最后使用浮点数:float((double)rand()/(double)(rand_MAX/a))。在我看来,cleares形式是一个*(N/rand_MAX),因为
N/rand_MAX
是一个介于0和1之间的随机数。@Glenmaynard:如果你被
(rand_MAX+1ll)除以(大概是2的幂),你只需要缩放FP指数。有些舍入实际上是必要的:如果您想在[0..1]上生成统一的浮点值,但仍然有机会生成每个可表示的浮点值,则需要多个整数值来舍入到范围0.5,1部分的相同最终浮点值。指数越小,每个可表示的浮点越接近,这就是为什么不能只使用
rand
来生成FP位模式(不会是均匀的)。除非只使用~24位熵,这样每个可能的输出都是均匀分布的(例如,生成[1,2],然后减去1.0),每1次你得到一个非常小的数字,要使分布均匀,需要多次获得0.5,1范围内的数字。尽管如此,用
RAND_MAX
来代替
RAND_MAX+1
可能意味着转换RAND->double有一些好处,或者至少有一些区别。(使用double,您可能有足够的精度来使用乘法逆而不是实际除法。)这是一个不错的技巧,也是唯一一个处理通过缩放随机数€[0..RAND_MAX]€N引入的量化的技巧。但是,两个随机数和正弦的乘法会导致非均匀分布。这能以某种方式规避吗?
#include <stdio.h>
#include <stdlib.h>
#include <time.h>


float
random_float(const float min, const float max)
{
    if (max == min) return min;
    else if (min < max) return (max - min) * ((float)rand() / RAND_MAX) + min;

    // return 0 if min > max
    return 0;
}


int
main (const int argc, const char *argv[])
{
    srand(time(NULL));

    char line[] = "-------------------------------------------";

    float data[10][2] = {
        {-10, 10},
        {-5., 5},
        {-1, 1},
        {-0.25, -0.15},
        {1.5, 1.52},
        {-1700, 8000},
        {-0.1, 0.1},
        {-1, 0},
        {-1, -2},
        {1.2, 1.1}
    };

    puts(line);
    puts("     From    |    Result    |      To");
    puts(line);


    int i;
    for (i = 0; i < 10; ++i) {
        printf("%12f | %12f | %12f\n", data[i][0], random_float(data[i][0], data[i][1]), data[i][1]);
    }

    puts(line);

    return 0;
}
-------------------------------------------
     From    |    Result    |      To
-------------------------------------------
  -10.000000 |     2.330828 |    10.000000
   -5.000000 |    -4.945523 |     5.000000
   -1.000000 |     0.004242 |     1.000000
   -0.250000 |    -0.203197 |    -0.150000
    1.500000 |     1.513431 |     1.520000
-1700.000000 |  3292.941895 |  8000.000000
   -0.100000 |    -0.021541 |     0.100000
   -1.000000 |    -0.148299 |     0.000000
   -1.000000 |     0.000000 |    -2.000000
    1.200000 |     0.000000 |     1.100000
-------------------------------------------
float float_rand( float min, float max )
{
    float scale = rand() / (float) RAND_MAX; /* [0, 1.0] */
    return min + scale * ( max - min );      /* [min, max] */
}
#include <math.h>

float func_Uniform(float left, float right) {
    float randomNumber = sin(rand() * rand());
    return left + (right - left) * fabs(randomNumber);
}