2016-10-05 60 views
1

我想用下面的C代碼生成32位隨機數。對於小型'LOOP',它運作良好。但對於較大的LOOP> 1024 * 1024 * 4,所有最終值都將變爲1/32。你能否在下面的代碼中解釋問題出在哪裏?我的隨機32位代的錯誤

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

#define ul unsigned int 
#define ull unsigned long long 



ul myrand32(){ 

     ul temp=4294967296.0*drand48(); 

     return temp; 

} 

int main(){ 

ul temp; 
ull i,j,s,Z, LOOP=1024*1024*1024; 
double A[32]; 
srand(time(NULL)); 
srand48(time(NULL)); 

for(i=0;i<32;i++) 
    A[i]=0; 

for(i=0;i<LOOP;i++){ 
        temp=myrand32();  

        j=temp%32; 
        A[j]+=1; 


       } 

for(j=0;j<32;j++) 
    printf("%lf %llu %lf\n", A[j]/i,j,1.0/32); 

} 
+1

我認爲這是精度 - 乘以2^32確保所有的精度位移入數字的頂部,然後該值被截斷爲32,只留下5位信息,從低端雙倍的準確度。嘗試乘以0x10000 => 65536而不是0x100000000。 – mksteve

+0

或使用'int n32bit = rand()| (rand()<< 16)' –

+0

當你想要一個32位的整數時使用uint32_t。不是int,long或類似的東西,即使它在你的plattform上也是32位。在其他平臺上,int和long將具有不同的大小。 – 12431234123412341234123

回答

1

所以drand48使用48位隨機數。這將在二進制浮點數中生成一個介於0和1之間的數字。

0.000000000000000000000000000000000000000000000000 
and 
0.111111111111111111111111111111111111111111111111 

(不太1,但與48「1'。)

當由40億相乘,即變成

0000000000000000000000000000000000000000000000000000000000000000 
to 
1111111111111111111111111111111111111111111111110000000000000000 

當截斷爲5個比特,即

00000 
00000 

乘以所需的範圍...例如32,而不是一大堆。

+0

什麼是「bicimal」? – 2016-10-05 07:25:09