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;
}
4

3 回答 3

5

[编辑] 最初的答案是 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 次迭代,每个值x0 到 10,000,000大约出现107.37 次。相反,它们的范围从 107 到 108 次。

将多个rand()调用结果与或+结合起来会导致结果分布出现明显偏差。*|

[编辑]

RAND_MAX对于 OP 的平台是 32767 (0x7FFF)。C 规范说“RAND_MAX 宏的值应至少为 32767”。因为 RAND_MAX可能超过 15 位,所以在其他平台上使用时使用^上面的运算符而不是|此代码很重要。

于 2013-11-09T04:55:49.487 回答
2

% 1000001如果您想要 0 到 1000000 之间的数字,请计算。也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;
}
于 2013-11-08T23:24:10.890 回答
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));
}
于 2020-03-04T17:18:01.077 回答