6

我对以下代码有疑问:

#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 和 Code::Blocks 上测试编译)

10989
13493
13169
18581
17972
29

在此先感谢您帮助 C++ 学习者 ;)

4

4 回答 4

9

rand() 只生成不超过其 RAND_MAX 的数字。

根据MSDN,在 Windows 上 RAND_MAX 仅为 32767,或 (2**15 - 1)(请注意,这是根据 C 标准允许的最小 RAND_MAX(此处链接到基于 C 标准的开放组基本规范)) .

如果您想要更大的数字,则需要多次调用它并进行位移,例如:

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

键盘上的示例)。

于 2012-04-09T14:44:24.830 回答
5

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

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

于 2012-04-09T14:44:25.090 回答
4

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

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

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

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

于 2012-04-09T14:44:53.963 回答
2

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

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

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

于 2012-04-09T14:45:20.423 回答