随机32位生成错误

时间:2016-10-05 06:39:05

标签: c

我想使用以下C代码生成32位随机数。对于小型的LOOP',它运作良好。但是对于较大的LOOP> 1024 * 1024 * 4,所有最终值变为1/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 个答案:

答案 0 :(得分:1)

所以drand48使用了48位的randmonness。这将在二进制浮点中生成介于0和1之间的数字,如下所示。

0.000000000000000000000000000000000000000000000000
and
0.111111111111111111111111111111111111111111111111

(不是1,但是48'1。)

当乘以40亿时,变成

0000000000000000000000000000000000000000000000000000000000000000
to
1111111111111111111111111111111111111111111111110000000000000000

截断为5位时,即

00000
00000

乘以所需的范围......例如32,而不是大数。