C++實(shí)現(xiàn)隨機(jī)數(shù)生成的現(xiàn)代化封裝
背景知識
隨機(jī)數(shù)的生成
C++ 的標(biāo)準(zhǔn)庫提供了一套強(qiáng)大且靈活的隨機(jī)數(shù)工具,主要通過以下幾部分組成:
- 隨機(jī)數(shù)引擎:例如
std::mt19937,生成偽隨機(jī)數(shù)序列。 - 分布:例如
std::uniform_int_distribution,對隨機(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ù)。
- 按概率生成布爾值。
- 對容器進(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ī)性。其名字來源于生成 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)用方式:
分布對象dist是一個(gè)可調(diào)用對象。通過傳入隨機(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:- 對容器元素進(jìn)行隨機(jī)排列。
- 使用
rnd引擎,確保偽隨機(jī)性。
模板設(shè)計(jì):
允許對任何std::vector<T>類型的容器進(jìn)行操作。
示例:
Random random;
std::vector<int> vec = {1, 2, 3, 4, 5};
random(vec); // 隨機(jī)打亂 vec
使用場景
隨機(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)庫中的分布對象生成特定范圍或分布的隨機(jī)數(shù)。
- 封裝常用隨機(jī)功能,提高代碼的可讀性和復(fù)用性。
到此這篇關(guān)于C++實(shí)現(xiàn)隨機(jī)數(shù)生成的現(xiàn)代化封裝的文章就介紹到這了,更多相關(guān)C++隨機(jī)數(shù)現(xiàn)代化封裝內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
QT使用canon sdk拍照并保存到本機(jī)的方法示例
這篇文章主要介紹了QT使用canon sdk拍照并保存到本機(jī)的方法示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10
C++?Protobuf實(shí)現(xiàn)接口參數(shù)自動校驗(yàn)詳解
用C++做業(yè)務(wù)發(fā)開的同學(xué)是否還在不厭其煩的編寫大量if-else模塊來做接口參數(shù)校驗(yàn)?zāi)??今天,我們就模擬Java里面通過注解實(shí)現(xiàn)參數(shù)校驗(yàn)的方式來針對C++?protobuf接口實(shí)現(xiàn)一個(gè)更加方便、快捷的參數(shù)校驗(yàn)自動工具,希望對大家有所幫助2023-04-04
C++中4種強(qiáng)制類型轉(zhuǎn)換的區(qū)別詳析
這篇文章主要給大家介紹了關(guān)于C++中4種強(qiáng)制類型轉(zhuǎn)換區(qū)別的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03
c++ 入門——淺析構(gòu)造函數(shù)和析構(gòu)函數(shù)
這篇文章主要介紹了c++ 淺析構(gòu)造函數(shù)和析構(gòu)函數(shù)的相關(guān)資料,幫助大家入門c++ 編程,感興趣的朋友可以了解下2020-08-08
C++ 實(shí)現(xiàn)一個(gè)復(fù)數(shù)類的實(shí)例代碼
這篇文章主要介紹了C++ 實(shí)現(xiàn)一個(gè)復(fù)數(shù)類的實(shí)例代碼,代碼簡單易懂,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-04-04

