如何在 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