我对以下代码有疑问:
#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 的数字,因此您可以从代码中获得少量数字。