1. 简介
对于许多程序开发人员而言,生成随机数是一项重要的任务。而在C++语言中,生成随机数的方法有很多种。本文将讨论在C++中生成随机数的不同方法,包括使用rand()函数、引入第三方库如Boost和C++11中的random库。
2. 使用rand()函数生成随机数
2.1 rand()函数的介绍
在C++中,rand()函数是用于生成伪随机数的标准函数。 在每次调用该函数时,它都会返回一个介于0和RAND_MAX(通常为32767)之间的伪随机整数。
#include
#include
#include
int main()
{
// 产生随机种子,调用一次即可
srand((unsigned int)time(nullptr));
// 生成10个随机整数
for(int i = 0; i < 10; ++i)
std::cout << rand() << std::endl;
return 0;
}
下面是上面代码的输出,由于是随机生成,因此每次输出结果都不同。
输出结果:
1804289383846930886
1681692777
1714636915
1957747793
424238335
719885386
1649760492
596516649
1189641421
2.2 rand()函数的问题
虽然rand()函数是C++语言生成伪随机数的标准函数,但它的随机性和分布性都有问题。以下是rand()函数的一些问题:
rand()函数的内部机制很简单,导致生成的随机数很大程度上依赖于种子值。
rand()函数生成的是均匀分布的随机数,如果需要使用其他类型的分布,必须使用其他方法来生成更多样的分布。
在多个操作系统中,rand()函数使用的算法不同,因此生成的随机数序列是不可移植的。
3. 使用Boost库生成随机数
3.1 Boost库的介绍
Boost是一个流行的、高质量的C++库集合,它提供了许多现代化而又通用的工具和算法,包括随机数生成。
在使用Boost库之前,需要从其官网上下载并安装Boost库。
3.2 使用uniform_int_distribution生成整数随机数
使用Boost库生成整数随机数相对于使用rand()函数来说更为简单。这是因为Boost library提供了很多种生成随机数的方法,其中最流行的是使用uniform_int_distribution。
#include
#include
#include
#include
// 将产生的随机数范围控制在0~99之间
int main()
{
// 产生随机种子,调用一次即可
srand((unsigned int)time(nullptr));
// 定义随机数生成器
boost::random::mt19937 rng(std::time(nullptr));
// 定义随机数分布和参数
boost::random::uniform_int_distribution<> index_dist(0, 99);
// 产生10个0~99之间的随机整数
for(int i = 0; i < 10; ++i)
std::cout << index_dist(rng) << std::endl;
return 0;
}
上面代码中,std::time(nullptr)是因为在程序中需要产生随机数,同时又需要使用一定的随机种子。std::time(nullptr)函数会返回当前时间的UNIX时间戳,这是一个非常常见的种子选择方法。rng是随机数生成器的类型,而index_dist是随机数分布类型,并将随机数的范围设置在0~99之间。
下面是上面代码的输出结果,由于是随机生成,因此每次输出结果都不同。
输出结果:
7211
5
74
41
59
34
75
18
55
4. 使用C++11中的random库生成随机数
4.1 C++11中的random库介绍
在C++11中新增了一套随机数分发库,用于代替以前的rand()库。C++11中的random库提供了更多新的随机数分类,如伯努利分布、泊松分布等。
在使用C++11中的random库之前,需要确保编译器已支持C++11,同时需要包含
4.2 使用uniform_int_distribution生成整数随机数
和Boost库一样,C++11中的random库也提供了uniform_int_distribution生成均匀分布的随机数。
#include
#include
int main()
{
// 随机数生成器
std::default_random_engine generator(std::chrono::system_clock::now().time_since_epoch().count());
// 随机数分布类型和参数
std::uniform_int_distribution distribution(0, 99);
// 产生10个0~99之间的随机整数
for(int i = 0; i < 10; ++i)
std::cout << distribution(generator) << std::endl;
return 0;
}
上面代码中,std::default_random_engine是随机数生成器的类型,而std::uniform_int_distribution是随机数分布类型,并将随机数的范围设置在0~99之间。
下面是上面代码的输出结果,由于是随机生成,因此每次输出结果都不同。
输出结果:
583
82
40
28
10
59
46
40
1
4.3 设置随机数分布
C++11的random库允许设置分布为非线性或自定义概率分布的随机数生成器。在设置非线性分布时,可以使用std::normal_distribution、std::exponential_distribution、std::lognormal_distribution、std::gamma_distribution、std::weibull_distribution等分布。
#include
#include
int main()
{
// 随机数生成器
std::default_random_engine generator(std::chrono::system_clock::now().time_since_epoch().count());
// 设置指数分布的参数(平均值)
double mean = 5.0;
std::exponential_distribution distribution(1.0 / mean);
// 产生10个指数分布的随机浮点数
for(int i = 0; i < 10; ++i)
std::cout << distribution(generator) << std::endl;
return 0;
}
5. 总结
C++是一门健壮而又强大的编程语言,它允许开发人员使用多种方式来生成随机数。本文介绍了C++中的三种不同方式来生成随机数,它们分别是使用rand()函数、使用Boost库和使用C++11中的random库。当需要生成运算随机数时,推荐使用Boost和C++11中的random库,这两个库提供了多种随机数类型和分布类型,且在生成随机数的质量和分布方面比rand()函数更强大和可靠。