c stdlib.h中RAND_MAX和rand()的说明

时间:2018-08-28 06:05:06

标签: c gnu ansi ansi-c

当RAND_MAX的值似乎为double a,b时,为什么以下c代码对于0.000000只能产生介于0和1之间的实数(例如:0.840188,0.394383 ... etc)。 RAND_MAX是否应该为rand()函数生成的数字设置最大值?

    #include <stdio.h>
    #include <stdlib.h>
    int main()
    {

    double a,b,c;
    for (int i=0;i<100;i++){
    a=(double)rand()/(double)RAND_MAX;
    b=(double)rand()/(double)RAND_MAX;
    c=a-b;
    printf("itteration : %d values a=%f,b=%f,c=%f, RAND_MAX=%f \n",i,a,b,c,RAND_MAX);
    }  
    return 0;
    }

2 个答案:

答案 0 :(得分:5)

RAND_MAX是一个整数常量,但是您正在使用%f说明符(用于double)打印它,这是未定义的行为(在您的情况下恰好打印0) 。使用%d,您将看到RAND_MAX的实际值。

顺便说一句,如果您将警告提高得足够高,几乎所有不错的编译器都会警告您有关无效的printf。确保这样做,C和C ++充满了陷阱,至少让编译器在可能的情况下为您提供帮助。

答案 1 :(得分:1)

  

... RAND_MAX的值似乎是0.000000。

您正在使用说明符将整数打印为双精度。这是未定义的行为。

根据C99标准(N1256)。

  

7.19.6.3 printf功能
  ...
  2. printf函数等效于fprintf ,其中插入了stdout参数   在printf的参数之前。

     

7.19.6.1 fprintf函数
  ....
  9.如果转换规范无效,则行为未定义。 如果有任何论点   不是对应转换规范的正确类型,其行为是   未定义。

因此它为0.000打印RAND_MAX。您的另一个问题:

  

RAND_MAX是否应为rand()函数生成的数字设置最大值?

rand()返回0RAND_MAX范围内的伪随机数。 RAND_MAX是一个常量,其默认值可能在实现之间有所不同,但被授予至少为32767的值。

但是rand()RAND_MAX的浮点除法将产生介于01之间的值。