如何生成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;
}
答案 0 :(得分:4)
[编辑]最初的答案是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;
分布非常平坦,但确实引入了非常小偏差。在32768 * 32768次迭代之后,x
0到10,000,000的每个值约 107.37次。相反,它们的范围是107到108倍。
将多个rand()
来电结果与+
,*
或|
合并将导致结果分布出现重大偏差。
[编辑]
对于OP平台, RAND_MAX
为32767(0x7FFF)。 C规范说“RAND_MAX宏的值至少应为32767”。由于RAND_MAX 可能长于15位,因此在其他平台上使用此代码时,使用上面的^
运算符而不是|
非常重要。
答案 1 :(得分:2)
如果您想要0到1000000之间的数字,请使用% 1000001
进行计算。
同样RAND_MAX
保证至少为32767
int main(){
int i, x;
srand(time(NULL));
for(i=0; i<10000; i++){
x = (rand() * rand()) % 1000001;
printf("%d\n",x);
}
return 0;
}
答案 2 :(得分:0)
使用此功能,它将为您提供两个数字(最小和最大)之间的随机数:
unsigned long int my_rand (unsigned long int Min, unsigned long int Max)
{
static int first = 0;
if (first == 0)
{
srand (time (NULL)); //initialize generator of random number
first = 1;
}
return ((unsigned long int)(rand() * (Max+1 - Min) / RAND_MAX + Min));
}