澄清了c stdlib.h中的RAND_MAX和rand()

The*_*eer 1 c gnu ansi ansi-c

为什么以下c代码产生的实数仅在0到1之间(例如:0.840188,0.394383 ...等),double a,b当RAND_MAX的值出现时0.000000.不应该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;
    }
Run Code Online (Sandbox Code Playgroud)

Mat*_*lia 5

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

顺便说一下,printf如果你发出足够高的警告,几乎任何体面的编译器都会警告你这个无效.确保这样做,C和C++充满了陷阱,至少让编译器尽可能地帮助你.