日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

C++相关:部分标准库特殊设施

發(fā)布時(shí)間:2023/12/18 c/c++ 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++相关:部分标准库特殊设施 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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.2

tuple的基本操作

操作說明
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)用,如果程序的自動過程反復(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è)游戲中決定玩家和電腦誰先行動的情景,不停輸入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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。