代码链接:https://wandbox.org/permlink/piWyOPiMyG0tggQK
C++11 提供了新的随机数生成方法,随机数的相关类声明都位于<random>
头文件中,完整说明可参考:random,此处选择一些常用的总结一下。
std::mt19937
是C++11加入的新特性,是一种高效的随机数生成算法。它的用法和rand()相似,但是具有速度快,周期长的特点。它的名字就来自于周期长度2^19937-1
。而rand()在windows下生成的数据范围为0-32767。而这个函数的随机范围大概在(-maxint,+maxint)之间。std::mt19937
和std::mt19937_64
,前者是32位的,后者是64位的。
在C语言中,要生成特定分布的随机数并不容易,不过在C++中这就很简单了,C++中提供了各种常用分布的实现,直接调用就可以了。比如最常用的均匀分布的整数:std::uniform_int_distribution
;均匀分布的小数:std::uniform_real_distribution
;正态分布:std::normal_distribution
等。
完整代码如下:
#include <random>
#include <iostream>
int gen_random(int num)
{
std::random_device rd; //Get a random seed from the OS entropy device, or whatever
std::mt19937_64 eng(rd()); //Use the 64-bit Mersenne Twister 19937 generator
std::uniform_int_distribution<unsigned long long> distr(1, num);// distribution in range [1, num]
return distr(eng);
}
int main() {
int num = 40;
for(int i = 0; i < 10; i++)
{
std::cout << gen_random(num) << std::endl; // random number in range[1, num]
}
std::cout << std::endl;
}