欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C++實(shí)現(xiàn)隨機(jī)數(shù)生成的現(xiàn)代化封裝

 更新時(shí)間:2024年11月18日 08:56:35   作者:T0uken  
在現(xiàn)代?C++?中,隨機(jī)數(shù)生成是許多程序設(shè)計(jì)中不可或缺的部分,例如游戲開發(fā)、算法設(shè)計(jì)、統(tǒng)計(jì)模擬等,本文將以一個(gè)封裝好的隨機(jī)工具類?Random?為例,深入剖析其功能的實(shí)現(xiàn)與使用,并引入相關(guān)知識(shí),幫助讀者觸類旁通,掌握?C++?隨機(jī)數(shù)的核心技巧

背景知識(shí)

隨機(jī)數(shù)的生成

C++ 的標(biāo)準(zhǔn)庫(kù)提供了一套強(qiáng)大且靈活的隨機(jī)數(shù)工具,主要通過以下幾部分組成:

  • 隨機(jī)數(shù)引擎:例如 std::mt19937,生成偽隨機(jī)數(shù)序列。
  • 分布:例如 std::uniform_int_distribution,對(duì)隨機(jī)數(shù)進(jìn)行分布轉(zhuǎn)換。
  • 隨機(jī)數(shù)種子:用于初始化隨機(jī)數(shù)引擎,保證隨機(jī)性。

類的設(shè)計(jì)原則

在設(shè)計(jì)一個(gè)通用的隨機(jī)工具類時(shí),我們可以封裝常見的隨機(jī)操作,例如:

  • 生成指定范圍內(nèi)的整數(shù)或浮點(diǎn)數(shù)。
  • 按概率生成布爾值。
  • 對(duì)容器進(jìn)行隨機(jī)打亂。

類定義與功能分解

以下是 Random 類的完整定義:

#include <chrono>
#include <iostream>
#include <random>
#include <algorithm>

struct Random {
    std::mt19937 rnd;

    Random()
        : rnd(std::chrono::steady_clock::now().time_since_epoch().count()) {}
    
    void setSeed(unsigned int seed) {  
        rnd.seed(seed);  
    }

    int operator()(int l, int r) {
        return std::uniform_int_distribution(l, r)(rnd);
    }

    double operator()(double l, double r) {
        return std::uniform_real_distribution(l, r)(rnd);
    }

    bool operator()(double p) {
        return std::bernoulli_distribution(p)(rnd);
    }

    template<typename T>
    void operator()(std::vector<T>& vec) {  
        std::shuffle(vec.begin(), vec.end(), rnd);  
    }
};

下面,我們逐一拆解并講解其核心部分。

隨機(jī)數(shù)引擎的初始化

Random()
    : rnd(std::chrono::steady_clock::now().time_since_epoch().count()) {}
  • std::mt19937
    std::mt19937 是一種基于梅森旋轉(zhuǎn)算法的偽隨機(jī)數(shù)生成器,具有較好的性能和隨機(jī)性。其名字來(lái)源于生成 19937 位的周期序列。

  • 初始化種子

    • 默認(rèn)使用當(dāng)前時(shí)間戳(以納秒為單位)作為種子。
    • 時(shí)間戳通過 std::chrono::steady_clock 獲取,保證種子不同步。

設(shè)置隨機(jī)數(shù)種子

void setSeed(unsigned int seed) {  
    rnd.seed(seed);  
}
  • 種子控制隨機(jī)性
    • 給定相同的種子,隨機(jī)數(shù)生成序列是確定的。
    • 這種特性非常適合調(diào)試和可復(fù)現(xiàn)的實(shí)驗(yàn)。

生成隨機(jī)整數(shù)

int operator()(int l, int r) {
    return std::uniform_int_distribution(l, r)(rnd);
}
  • std::uniform_int_distribution

    • 用于生成均勻分布的整數(shù)。
    • 構(gòu)造函數(shù)參數(shù)為上下界 [l, r]。
  • 調(diào)用方式
    分布對(duì)象 dist 是一個(gè)可調(diào)用對(duì)象。通過傳入隨機(jī)引擎 rnd,即可生成一個(gè)隨機(jī)數(shù)。

示例:

Random random;
int number = random(1, 10); // 生成 [1, 10] 范圍內(nèi)的隨機(jī)整數(shù)

生成隨機(jī)浮點(diǎn)數(shù)

double operator()(double l, double r) {
    return std::uniform_real_distribution(l, r)(rnd);
}
  • std::uniform_real_distribution
    • 用于生成均勻分布的浮點(diǎn)數(shù)。
    • 構(gòu)造函數(shù)參數(shù)為上下界 [l, r),即下界閉、上界開。

示例:

Random random;
double value = random(0.0, 1.0); // 生成 [0.0, 1.0) 范圍內(nèi)的隨機(jī)浮點(diǎn)數(shù)

按概率生成布爾值

bool operator()(double p) {
    return std::bernoulli_distribution(p)(rnd);
}
  • std::bernoulli_distribution
    • 按照給定的概率 p 返回 true 或 false。
    • 構(gòu)造函數(shù)參數(shù) p 表示返回 true 的概率,范圍為 [0, 1]。

示例:

Random random;
bool result = random(0.7); // 70% 概率返回 true,30% 概率返回 false

隨機(jī)打亂容器

template<typename T>
void operator()(std::vector<T>& vec) {  
    std::shuffle(vec.begin(), vec.end(), rnd);  
}
  • std::shuffle

    • 對(duì)容器元素進(jìn)行隨機(jī)排列。
    • 使用 rnd 引擎,確保偽隨機(jī)性。
  • 模板設(shè)計(jì)
    允許對(duì)任何 std::vector<T> 類型的容器進(jìn)行操作。

示例:

Random random;
std::vector<int> vec = {1, 2, 3, 4, 5};
random(vec); // 隨機(jī)打亂 vec

使用場(chǎng)景

隨機(jī)分配任務(wù)

假設(shè)有 10 個(gè)任務(wù)需要隨機(jī)分配給 3 名員工:

Random random;
std::vector<int> tasks = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
random(tasks);

for (int i = 0; i < tasks.size(); ++i) {
    std::cout << "Task " << tasks[i] << " -> Employee " << random(1, 3) << "\n";
}

模擬拋硬幣

Random random;
int heads = 0, tails = 0;

for (int i = 0; i < 100; ++i) {
    if (random(0.5)) {
        ++heads; // 正面
    } else {
        ++tails; // 反面
    }
}

std::cout << "Heads: " << heads << ", Tails: " << tails << "\n";

小結(jié)

通過本文的剖析,我們從以下幾個(gè)方面深入了解了 Random 類的設(shè)計(jì)與實(shí)現(xiàn):

  • 使用 std::mt19937 隨機(jī)數(shù)引擎生成高質(zhì)量偽隨機(jī)數(shù)。
  • 利用 C++ 標(biāo)準(zhǔn)庫(kù)中的分布對(duì)象生成特定范圍或分布的隨機(jī)數(shù)。
  • 封裝常用隨機(jī)功能,提高代碼的可讀性和復(fù)用性。

到此這篇關(guān)于C++實(shí)現(xiàn)隨機(jī)數(shù)生成的現(xiàn)代化封裝的文章就介紹到這了,更多相關(guān)C++隨機(jī)數(shù)現(xiàn)代化封裝內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 詳解C語(yǔ)言#define預(yù)處理宏定義

    詳解C語(yǔ)言#define預(yù)處理宏定義

    本文主要介紹了C語(yǔ)言#define預(yù)處理宏定義,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • QT使用canon sdk拍照并保存到本機(jī)的方法示例

    QT使用canon sdk拍照并保存到本機(jī)的方法示例

    這篇文章主要介紹了QT使用canon sdk拍照并保存到本機(jī)的方法示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-10-10
  • 詳解C語(yǔ)言讀取文件求某一列的平均值

    詳解C語(yǔ)言讀取文件求某一列的平均值

    本文粗淺比較了C語(yǔ)言中常用的幾種讀取文件的函數(shù)的效率,并給出了幾段求取某列平均值的代碼,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多度進(jìn)步
    2022-02-02
  • C++?Protobuf實(shí)現(xiàn)接口參數(shù)自動(dòng)校驗(yàn)詳解

    C++?Protobuf實(shí)現(xiàn)接口參數(shù)自動(dòng)校驗(yàn)詳解

    用C++做業(yè)務(wù)發(fā)開的同學(xué)是否還在不厭其煩的編寫大量if-else模塊來(lái)做接口參數(shù)校驗(yàn)?zāi)??今天,我們就模擬Java里面通過注解實(shí)現(xiàn)參數(shù)校驗(yàn)的方式來(lái)針對(duì)C++?protobuf接口實(shí)現(xiàn)一個(gè)更加方便、快捷的參數(shù)校驗(yàn)自動(dòng)工具,希望對(duì)大家有所幫助
    2023-04-04
  • C++中4種強(qiáng)制類型轉(zhuǎn)換的區(qū)別詳析

    C++中4種強(qiáng)制類型轉(zhuǎn)換的區(qū)別詳析

    這篇文章主要給大家介紹了關(guān)于C++中4種強(qiáng)制類型轉(zhuǎn)換區(qū)別的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • Qt QChart實(shí)現(xiàn)折線圖的繪制

    Qt QChart實(shí)現(xiàn)折線圖的繪制

    QChart是常用的圖表,這篇文章主要為大家詳細(xì)介紹了Qt如何利用QChart實(shí)現(xiàn)折線圖的繪制,文中的示例代碼講解詳細(xì),感興趣的可以了解一下
    2023-04-04
  • c++ 入門——淺析構(gòu)造函數(shù)和析構(gòu)函數(shù)

    c++ 入門——淺析構(gòu)造函數(shù)和析構(gòu)函數(shù)

    這篇文章主要介紹了c++ 淺析構(gòu)造函數(shù)和析構(gòu)函數(shù)的相關(guān)資料,幫助大家入門c++ 編程,感興趣的朋友可以了解下
    2020-08-08
  • c++編寫簡(jiǎn)單的計(jì)算器程序

    c++編寫簡(jiǎn)單的計(jì)算器程序

    用c++語(yǔ)言實(shí)現(xiàn)一個(gè)簡(jiǎn)單的計(jì)算器,新手作品,僅僅包括基本的加減乘除運(yùn)算。希望能夠給菜鳥們一些啟發(fā)
    2016-05-05
  • C++ 實(shí)現(xiàn)一個(gè)復(fù)數(shù)類的實(shí)例代碼

    C++ 實(shí)現(xiàn)一個(gè)復(fù)數(shù)類的實(shí)例代碼

    這篇文章主要介紹了C++ 實(shí)現(xiàn)一個(gè)復(fù)數(shù)類的實(shí)例代碼,代碼簡(jiǎn)單易懂,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-04-04
  • CStdioFile的用法詳細(xì)解析

    CStdioFile的用法詳細(xì)解析

    CStdioFile 不支持Duplicate,LockRange,和UnlockRange 這幾個(gè)CFile 函數(shù)。如果在CStdioFile 中調(diào)用了這幾個(gè)函數(shù),將會(huì)出現(xiàn)CNoSupported 異常
    2013-09-09

最新評(píng)論