C++相关:部分标准库特殊设施
C++ tuple(元組)
tuple是C++11新標(biāo)準(zhǔn)里的類型。它是一個(gè)類似pair類型的模板。pair類型是每個(gè)成員變量各自可以是任意類型,但是只能有倆個(gè)成員,而tuple與pair不同的是它可以有任意數(shù)量的成員。但是每個(gè)確定的tuple類型的成員數(shù)目是固定的。聲明如下
tuple<int,int,float> tp(1,2,6.2);取值
cout << get<0>(tp) << endl; //輸出1 cout << get<1>(tp) << endl; //輸出2 cout << get<2>(tp) << endl; //輸出6.2tuple的基本操作
| 操作 | 說明 |
| make_tuple(v1,v2,v3,v4…vn) | 返回一個(gè)給定初始值初始化的tuple,類型從初始值推斷 |
| t1 == t2 | 當(dāng)倆個(gè)tuple具有相同數(shù)量的成員且成員對應(yīng)相等時(shí) |
| t1 != t2 | 與上一個(gè)相反 |
| get<i>(t) | 返回t的第i個(gè)數(shù)據(jù)成員 |
| tuple_size<tupletype>::value | 給定類型的tuple中成員的數(shù)量 |
C++隨機(jī)數(shù)
定義在頭文件random中的隨機(jī)數(shù)庫通過一組協(xié)作的類來解決這些問題:隨機(jī)數(shù)引擎類和隨機(jī)數(shù)分布類。 默認(rèn)隨機(jī)數(shù)引擎default_random_engine,基本使用如下: default_random_engine e;cout << "默認(rèn)范圍:" << e.min() <<"——" << e.max() << endl;for(int i = 0;i < 10;++i){cout << "生成的隨機(jī)數(shù)(默認(rèn)種子):" << e() << endl;} 基本操作 Engine e; //默認(rèn)構(gòu)造函數(shù)并使用默認(rèn)種子 Engine e(s); //使用整型值s作為種子 e.seed(s); //使用種子s重置引擎的狀態(tài) e.min(); //引擎生成的值的范圍 e.max(); Engine::result_type //此引擎生成的unsigned整型類型 e.discard(u); //將引擎推進(jìn)u步;u的類型為unsigned long long分布類型和引擎
為了得到一個(gè)指定范圍內(nèi)的數(shù),我們需要將分布對象和引擎對象組合使用,這種組合又稱為隨機(jī)數(shù)發(fā)生器。
//生成0到9之間(包含)均勻分布的隨機(jī)數(shù) uniform_int_distribution<unsigned> u(0,9); default_random_engine engine; //生成無符號隨機(jī)整數(shù) for(int i = 0;i < 10;i++) {//將u作為隨機(jī)數(shù)源//每個(gè)調(diào)用返回指定范圍內(nèi)的服從均勻分布的值//這里講引擎本身傳給u,原因是某些分布可能需要調(diào)用引擎多次才能得到一個(gè)值//如果寫成u(e())會導(dǎo)致編譯錯(cuò)誤cout << u(e) << " "; }生成不同的隨機(jī)數(shù)序列
一個(gè)給定的隨機(jī)數(shù)發(fā)生器一直會生成相同的隨機(jī)數(shù)序列,為了生成與之前不同的序列,可以將引擎和分布對象定義為static的
static uniform_int_distribution<unsigned> u(0,9); static default_random_engine engine;但這種方法僅適用于局部的隨機(jī)數(shù)發(fā)生器,另一種方法是調(diào)用系統(tǒng)時(shí)間函數(shù)time來作為發(fā)生器種子,這也是C中rand函數(shù)常使用的方法。聲明如下:
default_random_engine el(time(0));time返回從特定時(shí)刻到當(dāng)前經(jīng)過了多少秒,它接受單個(gè)指針參數(shù),指向用于寫入時(shí)間的數(shù)據(jù)結(jié)構(gòu),如果為空則直接返回時(shí)間。
但是time返回以秒計(jì)的時(shí)間,因此這種方法僅適用于生成種子的間隔為秒級或者更長的應(yīng)用,如果程序的自動(dòng)過程反復(fù)運(yùn)行的頻率過高,則可能多次使用的都是相同的種子。
其他隨機(jī)數(shù)分布
生成隨機(jī)實(shí)數(shù)
在C中,從rand獲得一個(gè)隨機(jī)浮點(diǎn)數(shù)的常用方法是用rand()的結(jié)果除以RAND_MAX,但這種方法并不正確,原因是隨機(jī)整數(shù)的精度通常低于隨機(jī)浮點(diǎn)數(shù),這樣一些浮點(diǎn)數(shù)永遠(yuǎn)不會生成。
在C++中,可以使用uniform_real_distribution類來處理從隨機(jī)整數(shù)到隨機(jī)浮點(diǎn)數(shù)的映射。代碼如下
default_random_engine e; uniform_real_distribution<double> u(0,1); for(int i = 0;i < 10;i++) {cout << u(e) << " "; }?輸出如下:
生成非均勻分布的隨機(jī)數(shù)
標(biāo)準(zhǔn)庫提供了20余種分布類型,具體可參考C++ Random?。
這里以伯努利分布為例,以下代碼模擬了一個(gè)游戲中決定玩家和電腦誰先行動(dòng)的情景,不停輸入y可以看到隨機(jī)生成兩種結(jié)果的一種——電腦先走或者玩家先走。
string resp;default_random_engine e; //e應(yīng)保持狀態(tài),所以必須在循環(huán)外定義bernoulli_distribution b; //默認(rèn)對半的機(jī)會do{bool first = b(e); //如果為true程序先走cout << (first?"We go first":"You go first") << endl;cout << "Gaming............" << endl;cout << "Game over.Input y to restart or exit" << endl;}while(cin >> resp && resp[i] == 'y')如果想給玩家一點(diǎn)作弊的小后門,可以調(diào)整先行一方的概率
bernoulli_distribution b(.45); //減少程序先行的概率這樣分布情況就為(0.45/0.55)
參考資料
《C++ Primer 第5版》 電子工業(yè)出版社? ? 作者:【美】? Stanley B. Lippman? && Josee Lajoie && Barbara E.Moo
? 伯努利分布
轉(zhuǎn)載于:https://www.cnblogs.com/0kk470/p/7908257.html
總結(jié)
以上是生活随笔為你收集整理的C++相关:部分标准库特殊设施的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 搭建集群时的问题总结
- 下一篇: ubuntu 安装过程所需软件