C++中的随机数生成

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;

}

下面是上面代码的输出,由于是随机生成,因此每次输出结果都不同。

输出结果:

1804289383

846930886

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之间。

下面是上面代码的输出结果,由于是随机生成,因此每次输出结果都不同。

输出结果:

72

11

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之间。

下面是上面代码的输出结果,由于是随机生成,因此每次输出结果都不同。

输出结果:

58

3

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()函数更强大和可靠。

后端开发标签