[英]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()
返回一個偽隨機數,范圍為0
到RAND_MAX
。 RAND_MAX
是一個常數,其默認值在實現之間可能會有所不同,但允許至少為32767
。
但是rand()
與RAND_MAX
浮點除法將產生一個介於0
和1
之間的值。
RAND_MAX 是一個 integer,當您使用 %f 打印它時,它以二進制形式被截斷。 實際上,0是二進制中RAND_MAX的最后幾位十進制顯示的
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.