生成0到10000000之间的随机数

时间:2013-11-08 23:20:27

标签: c random numbers

如何生成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;
}

3 个答案:

答案 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));
}