RAND_MAX在重铸时表现出异常的行为

时间:2011-07-20 14:13:20

标签: c

我希望生成介于0和1之间的随机数。(显然,这在其他地方有应用。)

我的测试代码:

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

int main() {
double uR;
srand(1);
for(int i=0;i<5;i++){
    uR = rand()/(RAND_MAX+1.000);
    printf("%d \n", uR);
    }
}

以下是使用GCC编译代码后的输出:

gcc -ansi -std=c99 -o rand randtest.c
./rand
0 
-251658240 
910163968 
352321536 
-528482304

经过检查,结果是将整数RAND_MAX转换为double会产生将其值从2147483647更改为-4194304的效果。无论用于将RAND_MAX更改为double类型的方法,都会发生这种情况;到目前为止,我也尝试了(double)RAND_MAXdouble max = RAND_MAX

为什么数字的值会发生变化?我怎么能阻止这种情况发生?

3 个答案:

答案 0 :(得分:3)

您无法使用double打印%d。如果你使用%f,它就可以了。

答案 1 :(得分:1)

当您需要uR时,您正在将{({1}})传递给printf。您应该使用signed int

进行投射或打印
%f

答案 2 :(得分:1)

您正在以十进制整数形式打印双精度值 - 这会让您感到困惑。

使用%.6f或类似内容。