簡體   English   中英

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

[英]clarification for RAND_MAX and rand() in c stdlib.h

為什么當 RAND_MAX 的值似乎是0.000000時,以下 c 代碼會為double a,b生成僅介於 0 和 1 之間的實數(例如:0.840188,0.394383...等)。 RAND_MAX不應該為rand() function 生成的數字設置最大值嗎?

    #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;
    }

RAND_MAX是一個整數常量,但是您正在使用%f說明符(用於double )來打印它,這是未定義的行為(在您的情況下,它會打印0)。 使用%d ,您會看到RAND_MAX的實際值。

順便說一下,如果您將警告提高得足夠高,幾乎所有不錯的編譯器都會警告您有關無效的printf 確保這樣做,C和C ++充滿了陷阱,至少讓編譯器在可能的情況下為您提供幫助。

... RAND_MAX的值似乎是0.000000。

您正在使用說明符打印一個雙精度整數。 這是未定義的行為。

來自C99標准(N1256)。

7.19.6.3 printf函數
...
2. printf函數等效於fprintf ,其參數stdout插入到printf的參數之前。

7.19.6.1 fprintf函數
....
9.如果轉換規范無效,則行為未定義。 如果任何參數都不是相應轉換規范的正確類型,則行為未定義。

因此,它為RAND_MAX打印0.000 您的其他問題:

RAND_MAX是否應為rand()函數生成的數字設置最大值?

rand()返回一個偽隨機數,范圍為0RAND_MAX RAND_MAX是一個常數,其默認值在實現之間可能會有所不同,但允許至少為32767

但是rand()RAND_MAX浮點除法將產生一個介於01之間的值。

RAND_MAX 是一個 integer,當您使用 %f 打印它時,它以二進制形式被截斷。 實際上,0是二進制中RAND_MAX的最后幾位十進制顯示的

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM