rand()%4000000000UL只给出小值

时间:2012-04-09 14:40:51

标签: c++ random srand

我对以下代码有疑问:

#include <iostream>
#include <ctime>

int main(){
    unsigned long int blob;   
    srand(time(0)); 

    for(int counter = 0; counter <= 100; counter++) {
        blob = rand() % 4000000000UL ;
        std::cout << blob << std::endl;
    }//for
    system("pause");
    return 0;
} //main

在codepad.org上输出大值,如

378332591
1798482639
294846778
1727237195
62560192
1257661042

但是在Windows 7 64位上,它只输出小值(在VS11&amp; Code :: Blocks上进行了测试编译)

10989
13493
13169
18581
17972
29

提前感谢帮助c ++学习者;)

4 个答案:

答案 0 :(得分:9)

rand()仅生成最多RAND_MAX的数字。

根据MSDN,在Windows上RAND_MAX仅为32767,或(2 ** 15 - 1)(请注意,这是根据C标准允许的最小RAND_MAX(此处为link to open group base spec,这是基于C标准))。

如果你想要更大的数字,你需要多次调用它和比特移位,例如:

long long int my_big_random = rand() ^ (rand() << 15) ^ ((long long int) rand() << 30);

example on codepad)。

答案 1 :(得分:5)

您遇到的行为是由于您正在测试的两个系统上的RAND_MAX值。

windows 7 system上,RAND_MAX是32767,这个值明显小于任何环境键盘运行代码的值。因此,随机生成的值的范围要小得多。

答案 2 :(得分:4)

Windows使用最大值为32767的随机数生成器。请参阅RAND_MAX的值。

您可以通过粘贴两个rand()调用的输出来创建一个更大的随机数。

big_rand = rand() << 15 | rand();

您还可以切换到其他随机数生成器,例如Boost.RandomC++11

答案 3 :(得分:2)

rand的结果取决于实现,并且保证仅高达32767:

http://en.cppreference.com/w/cpp/numeric/random/RAND_MAX

因此,当您在具有不同库实现的不同系统上运行代码时,您可以获得不同的结果 - Windows仅返回高达32767的数字,因此您可以从代码中获得较小的数字。