% 1000001
计算。同样可以保证RAND_MAX
至少为32767int main(){
int i, x;
srand(time(NULL));
for(i=0; i<10000; i++){
x = (rand() * rand()) % 1000001;
printf("%d\n",x);
}
return 0;
}
如何生成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到1,000,000。我现在看到它应该是0到10,000,000。
因为rand()
将给出至少15位的答案,多次调用rand()
,移位15并对结果进行XOR。最后修改10,000,001。
unsigned long x;
x = rand();
x <<= 15;
x ^= rand();
x %= 10000001;
分布非常平坦,但是确实引入了非常small]偏差。在32768 * 32768迭代之后,x
0到10,000,000的每个值出现约107.37次。相反,它们的范围是107到108倍。将多个rand()
调用结果与+
,*
或|
合并将导致结果分布的明显偏差。
[编辑]
RAND_MAX
为32767(0x7FFF)对于OP的平台。 C规范说“ RAND_MAX宏的值应至少为32767”。因为RAND_MAX
可能
大于15位,所以在其他平台上使用此代码时,使用上面的^
运算符而不是|
很重要。 % 1000001
计算。同样可以保证RAND_MAX
至少为32767int main(){
int i, x;
srand(time(NULL));
for(i=0; i<10000; i++){
x = (rand() * rand()) % 1000001;
printf("%d\n",x);
}
return 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)); }
% 1000001
计算。同样可以保证RAND_MAX
至少为32767int main(){
int i, x;
srand(time(NULL));
for(i=0; i<10000; i++){
x = (rand() * rand()) % 1000001;
printf("%d\n",x);
}
return 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));
}