如何生成从 0 到 1000000 的随机数?
我已经尝试过下面的代码,但它仍然给我从 0 到 32767 (RAND_MAX) 的数字:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(){
int i,x;
srand(time(NULL));
for(i=0; i<10000; i++){
int x = rand() % 10000000 + 1;
printf("%d\n",x);
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
[编辑] 最初的答案是 0 到 1,000,000。我现在看到它应该是 0 到 10,000,000。
由于rand()将给出至少 15 位的答案,rand()多次调用,移位 15 并对结果进行异或。最后修改 10,000,001。
unsigned long x;
x = rand();
x <<= 15;
x ^= rand();
x %= 10000001;
Run Code Online (Sandbox Code Playgroud)
分布非常平坦,但确实引入了非常小的偏差。经过 32768*32768 次迭代,每个x0 到 10,000,000 的值大约发生107.37 次。相反,它们的范围从 107 到 108 次。
将多个rand()调用结果与+、*或 组合|将导致结果分布的显着偏差。
[编辑]
RAND_MAX对于 OP 的平台,是 32767 (0x7FFF)。C 规范说“RAND_MAX 宏的值应至少为 32767”。由于 RAND_MAX可能长于 15 位,因此在其他平台上使用时,重要的是使用^上面的运算符而不是|用于此代码。
| 归档时间: |
|
| 查看次数: |
5673 次 |
| 最近记录: |