我观察到当rand()
库函数在循环中被调用一次时,它几乎总是产生正数。
for (i = 0; i < 100; i++) {
printf("%d\n", rand());
}
但是当我添加两个rand()
调用时,生成的数字现在有更多的负数。
for (i = 0; i < 100; i++) {
printf("%d = %d\n", rand(), (rand() + rand()));
}
有人能解释一下为什么我在第二个案例中看到负数吗?
PS:我在循环前将种子初始化为srand(time(NULL))
。
发布于 2015-06-14 01:18:10
发布于 2015-06-18 17:15:55
基本上,rand()
在0
和RAND_MAX
之间产生数字,在您的例子中是2 RAND_MAX > INT_MAX
。
你可以用你的数据类型的最大值取模以防止溢出。这当然会扰乱随机数的分布,但rand
只是一种快速获得随机数的方法。
#include <stdio.h>
#include <limits.h>
int main(void)
{
int i=0;
for (i=0; i<100; i++)
printf(" %d : %d \n", rand(), ((rand() % (INT_MAX/2))+(rand() % (INT_MAX/2))));
for (i=0; i<100; i++)
printf(" %d : %ld \n", rand(), ((rand() % (LONG_MAX/2))+(rand() % (LONG_MAX/2))));
return 0;
}
发布于 2015-06-16 15:50:20
也许您可以尝试一种相当棘手的方法,即确保2 rand()的和返回的值永远不会超过RAND_MAX的值。一种可能的方法是sum = rand()/2 + rand()/2;这将确保对于RAND_MAX值为32767的16位编译器,即使两个rand恰好都返回32767,即使那时(32767/2 = 16383) 16383+16383 = 32766,也不会产生负和。
https://stackoverflow.com/questions/30821406
复制相似问题