我正在阅读
C FAQ并在
question中发现它建议我使用rand()/(RAND_MAX / N 1)而不是更流行的方式是rand()%N.
原因是当N是一个低数字rand()%N将只使用rand()中的几个位.
我在Windows和Linux上测试了N为2的不同方法但是没有注意到差异.
#include
#include
#include
#define N 2
int main(void)
{
srand(0);
printf("rand() %% N:\n");
for (int i = 0; i < 40; ++i) {
printf("%d ",rand() % N);
}
putchar('\n');
srand(0);
printf("rand() / (RAND_MAX / N + 1):\n");
for (int i = 0; i < 40; ++i) {
printf("%d ",rand() / (RAND_MAX / N + 1));
}
putchar('\n');
return 0;
}
输出是这个(在我的gnu / linux机器上):
rand() % N:
1 0 1 1 1 1 0 0 1 1 0 1 0 1 1 0 0 0 0 0 1 0 1 1 0 0 0 1 1 1 1 0 0 0 1 1 1 0 1 0
rand() / (RAND_MAX / N + 1):
1 0 1 1 1 0 0 1 0 1 0 1 0 1 1 1 1 1 0 1 0 0 0 1 0 0 0 0 1 0 1 1 1 0 1 1 0 1 0 1
两种选择对我来说都是完全随机的.甚至看起来第二种方法比兰特%N更差.
我应该使用rand()%N还是rand()/(RAND_MAX / N 1)?