rand() x4000000000UL 只给出很小的值



我对以下代码有疑问:

#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++ 学习者;)

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

(代码键盘上的示例)。

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

在 Windows 7 系统上,RAND_MAX 是 32767,该值明显小于运行代码的任何环境代码板。因此,随机生成的值在明显较小的范围内。

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

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

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

您也可以切换到不同的随机数生成器,例如 Boost.Random 或 C++11。

rand 的结果依赖于实现,并保证仅高达 32767:

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

因此,当您使用不同的库实现在不同的系统上运行代码时,您可能会得到不同的结果 - Windows 只返回最多 32767 的数字,因此您可以从代码中获得少量数字。

最新更新