我的随机32位代的错误
问题描述:
我想用下面的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);
}
答
所以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
我认为这是精度 - 乘以2^32确保所有的精度位移入数字的顶部,然后该值被截断为32,只留下5位信息,从低端双倍的准确度。尝试乘以0x10000 => 65536而不是0x100000000。 – mksteve
或使用'int n32bit = rand()| (rand()
当你想要一个32位的整数时使用uint32_t。不是int,long或类似的东西,即使它在你的plattform上也是32位。在其他平台上,int和long将具有不同的大小。 – 12431234123412341234123