如何在 C++ 中生成范围内的随机数

Jinku Hu 2023年1月30日 2020年11月24日
  1. 使用 C++11 <random> 库生成一个范围内的随机数
  2. 使用 rand 函数生成一个范围内的随机数
如何在 C++ 中生成范围内的随机数

本文将演示多种 C++ 方法,讲述如何在指定的数字区间内生成随机数。

使用 C++11 <random> 库生成一个范围内的随机数

C++ 在 C++11 版本中,在新的头文件 <random> 下增加了随机数生成的标准库功能。<random> 头文件提供的 RNG 工作流功能分为两部分:随机引擎和分布。随机引擎负责返回不可预测的比特流。分布返回满足特定概率分布(如均匀、正态或其他)的随机数(类型由用户指定)。

首先,用户应该用种子值初始化随机引擎。建议使用 std::random_device 作为种子,这是系统特有的非确定性随机位的来源。它允许引擎在每次运行时产生不同的随机比特流。另一方面,如果用户需要在多个程序运行中生成相同的序列,则应使用 int 常量初始化随机引擎。

接下来,用参数初始化分布对象,参数为一个区间的最小/最大值,随机数就是从这个区间生成的。在下面的例子中,我们使用 uniform_int_distribution 并任意输出 10 个整数到控制台。

#include <iostream>
#include <random>

using std::cout;
using std::endl;

constexpr int MIN = 1;
constexpr int MAX = 100;

constexpr int RAND_NUMS_TO_GENERATE = 10;

int main()
{
    std::random_device rd;
    std::default_random_engine eng(rd());
    std::uniform_int_distribution<int> distr(MIN, MAX);

    for (int n = 0; n < RAND_NUMS_TO_GENERATE; ++n) {
        cout << distr(eng) << "; ";
    }
    cout << endl;

    return EXIT_SUCCESS;
}

输出:

57; 38; 8; 69; 5; 27; 65; 65; 73; 4;

<random> 头文件提供了多个随机引擎,有不同的算法和效率权衡。因此,可以初始化特定的随机引擎,如下一段代码示例所示。

#include <iostream>
#include <random>

using std::cout;
using std::endl;

constexpr int MIN = 1;
constexpr int MAX = 100;

constexpr int RAND_NUMS_TO_GENERATE = 10;

int main()
{
    std::random_device rd;
    std::mt19937 eng(rd());
    std::uniform_int_distribution<int> distr(MIN, MAX);

    for (int n = 0; n < RAND_NUMS_TO_GENERATE; ++n) {
        cout << distr(eng) << "; ";
    }
    cout << endl;

    return EXIT_SUCCESS;
}

输出:

59; 47; 81; 41; 28; 88; 10; 12; 86; 7;

使用 rand 函数生成一个范围内的随机数

rand 函数是 C 标准库的一部分,可以从 C++ 代码中调用。虽然不建议使用 rand 函数来生成高质量的随机数,但可以利用它来用任意数据填充数组或矩阵,以达到不同的目的。在本例中,该函数生成一个介于 0 和 MAX 数区间的随机整数。需要注意的是,这个函数应该用 std::srand 做种子(最好用 std::time(nullptr) 传递当前时间),以便在多次运行中产生不同的值,只有这样我们才能调用 rand

#include <iostream>
#include <random>
#include <ctime>

using std::cout;
using std::endl;

constexpr int MIN = 1;
constexpr int MAX = 100;

constexpr int RAND_NUMS_TO_GENERATE = 10;

int main()
{
    std::srand(std::time(nullptr));
    for (int i = 0; i < RAND_NUMS_TO_GENERATE; i++)
        cout << rand() % MAX  << "; ";
    cout << endl;

    return EXIT_SUCCESS;
}

输出:

36; 91; 99; 40; 3; 60; 90; 63; 44; 22;
Author: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn

相关文章 - C++ Random