生成一个从0到10000000的随机数

问题描述 投票:0回答:3

如何生成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;
}
c random numbers
3个回答
4
投票

[编辑]最初的答案是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位,所以在其他平台上使用此代码时,使用上面的^运算符而不是|很重要。
如果要在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; }

使用此功能,它将为您提供两个数字(最小和最大)之间的随机数:

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


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


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

© www.soinside.com 2019 - 2024. All rights reserved.