【C++11】隨機(jī)值獲取——random

我們知道升熊,C 中的隨機(jī)數(shù)函數(shù)只有一個(gè) rand( ) 俄烁,想生成某一區(qū)間范圍內(nèi)的隨機(jī)數(shù)乃至隨機(jī)的浮點(diǎn)數(shù)都十分麻煩。

而 C++11 中提供的 random 庫(kù)解決了這一問(wèn)題级野,它能讓我們方便地生成需要的隨機(jī)值页屠。

下面將介紹如何利用 random 庫(kù)中的組件生成符合條件的隨機(jī)數(shù)。

random 庫(kù)中的組件分為兩類——隨機(jī)數(shù)引擎類和隨機(jī)數(shù)分布類蓖柔。

隨機(jī)數(shù)引擎類是可以獨(dú)立運(yùn)行的隨機(jī)數(shù)發(fā)生器辰企,它以均勻的概率生成某一類型的隨機(jī)數(shù),但無(wú)法指定隨機(jī)數(shù)的范圍渊抽、概率等信息蟆豫。因此,它也被稱為“原始隨機(jī)數(shù)發(fā)生器”懒闷,由于不能指定生成隨機(jī)數(shù)的范圍十减,它通常不會(huì)被單獨(dú)使用。

隨機(jī)數(shù)分布類是一個(gè)需要于隨機(jī)數(shù)引擎類的支持才能運(yùn)行的類愤估,但是它能根據(jù)用戶的需求利用隨機(jī)數(shù)引擎生成符合條件的隨機(jī)數(shù)帮辟,例如某一區(qū)間、某一分布概率的隨機(jī)數(shù)玩焰。

所有隨機(jī)數(shù)引擎類都支持的操作如下:

名稱 功能
Engine e 創(chuàng)建一個(gè)引擎由驹。
Engine e(s) 創(chuàng)建一個(gè)引擎,并用 s 作為種子。
e.seed(s) 使用種子 s 充值 e 的狀態(tài)蔓榄。
e.min( ), e.max( ) e 能生成的最小值和最大值并炮。
e.discard(u) 將 e 推進(jìn) u 步(u 的類型為 unsigned long long)。

下表隨機(jī)數(shù)分布類共有的操作:

名稱 功能
U u 創(chuàng)建一個(gè)分布類 u 甥郑。
u(e) 用隨機(jī)數(shù)引擎 e 生成隨機(jī)數(shù)(u 代表隨機(jī)數(shù)分布類)逃魄。
u.min( ) u 能生成的最小值。
u.max( ) u 能生成的最大值澜搅。
u.reset( ) 重置 u 的狀態(tài)伍俘,使隨后 u 生成的值不受之前的值影響 。

隨機(jī)非負(fù)數(shù)——default_random_engine


default_random_engine 是一個(gè)隨機(jī)數(shù)引擎類勉躺。它定義的調(diào)用運(yùn)算符返回一個(gè)隨機(jī)的 unsigned 類型的值癌瘾。

因此,若想生成 10 個(gè)隨機(jī)非負(fù)數(shù)并輸出饵溅,程序可以這么寫:

#include <iostream>
#include <random>
using namespace std;

int main( ){
    default_random_engine e;
    for(int i=0; i<10; ++i)
        cout<<e( )<<endl;
    return 0;
}

在我們的系統(tǒng)中妨退,測(cè)試結(jié)果為:

16807
282475249
1622650073
984943658
1144108930
470211272
101027544
1457850878
1458777923
2007237709

可以看出,還是比較“隨機(jī)”的蜕企。

當(dāng)然碧注,default_random_engine 也只是一個(gè)偽隨機(jī)數(shù)發(fā)生器,如果在運(yùn)行一次程序糖赔,得到結(jié)果將還是這幾個(gè)數(shù)萍丐。

若想令每次運(yùn)行程序時(shí)的生成結(jié)果不同,可以為其設(shè)置較為隨機(jī)的種子放典,比如當(dāng)前系統(tǒng)的時(shí)間逝变。

特定范圍的非負(fù)數(shù)——uniform_int_distribution


uniform_int_distribution 是一個(gè)隨機(jī)數(shù)分布類,也是個(gè)模板類奋构,模板參數(shù)為生成隨機(jī)數(shù)的類型(不過(guò)只能是 int壳影、unsigned、short弥臼、unsigned short宴咧、long、unsigned long径缅、long long掺栅、unsigned long long 中的一種)。它的構(gòu)造函數(shù)接受兩個(gè)值纳猪,表示隨機(jī)數(shù)的分布范圍(閉區(qū)間)氧卧。

因此,一個(gè)生成 0 到 9 的隨機(jī)數(shù)程序可以這么寫:

#include <iostream>
#include <random>
using namespace std;

int main( ){
    default_random_engine e;
    uniform_int_distribution<unsigned> u(0, 9);
    for(int i=0; i<10; ++i)
        cout<<u(e)<<endl;
    return 0;
}

在我們的系統(tǒng)中氏堤,它的生成結(jié)果為:

0     
1     
7     
4     
5     
2     
0     
6     
6     
9     

隨機(jī)浮點(diǎn)數(shù)——uniform_real_distribution


uniform_real_distribution 是一個(gè)隨機(jī)數(shù)分布類沙绝,它也是模板類,參數(shù)表示隨機(jī)數(shù)類型(可選類型為 float、double闪檬、long double)星著。構(gòu)造函數(shù)也需要最大值和最小值作為參數(shù)。

下面是一個(gè)生成 10 個(gè) 0~1 之間的隨機(jī)浮點(diǎn)數(shù)的例子:

#include <iostream>
#include <random>
using namespace std;

int main( ){
    default_random_engine e;
    uniform_real_distribution<double> u(0.0, 1.0);
    for(int i=0; i<10; ++i)
        cout<<u(e)<<endl;
    return 0;
}

在我們的系統(tǒng)上的結(jié)果為:

0.131538
0.45865
0.218959
0.678865
0.934693
0.519416
0.0345721
0.5297
0.00769819
0.0668422

隨機(jī)布爾值——bernoulli_distribution


bernoulli_distribution 是一個(gè)分布類粗悯,但它不是模板類强饮。它的構(gòu)造函數(shù)只有一個(gè)參數(shù),表示該類返回 true 的概率为黎,該參數(shù)默認(rèn)為 0.5 ,即返回 true 和 false 的概率相等行您。

下面是一個(gè)生成 10 個(gè)隨機(jī)布爾值的例子:

#include <iostream>
#include <random>
using namespace std;

int main( ){
    default_random_engine e;
    bernoulli_distribution u;
    for(int i=0; i<10; ++i)
        cout<<u(e)<<endl;
    return 0;
}

在我們的系統(tǒng)上的結(jié)果為:

1
1
1
0
0
0
1
0
1
1

總結(jié)


常用的隨機(jī)數(shù)類如下:

  • default_random_engine:隨機(jī)非負(fù)數(shù)(不建議單獨(dú)使用)铭乾。
  • uniform_int_distribution:指定范圍的隨機(jī)非負(fù)數(shù)。
  • uniform_real_distribution:指定范圍的隨機(jī)實(shí)數(shù)娃循。
  • bernoulli_distribution:指定概率的隨機(jī)布爾值炕檩。

事實(shí)上,random 庫(kù)的功能極其豐富捌斧,其中的隨機(jī)數(shù)引擎不止有 default_random_engine 一個(gè)笛质,分布類也遠(yuǎn)遠(yuǎn)不止上述三個(gè)。它還能進(jìn)行泊松分布捞蚂、正態(tài)分布妇押、抽樣分等高級(jí)的隨機(jī)數(shù)功能,想詳細(xì)了解這些內(nèi)容請(qǐng)去查閱其他資料姓迅。我可能要等好久才能把這些內(nèi)容補(bǔ)上敲霍。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市丁存,隨后出現(xiàn)的幾起案子肩杈,更是在濱河造成了極大的恐慌,老刑警劉巖解寝,帶你破解...
    沈念sama閱讀 221,820評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件扩然,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡聋伦,警方通過(guò)查閱死者的電腦和手機(jī)夫偶,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,648評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)觉增,“玉大人索守,你說(shuō)我怎么就攤上這事∫制” “怎么了卵佛?”我有些...
    開(kāi)封第一講書人閱讀 168,324評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我截汪,道長(zhǎng)疾牲,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 59,714評(píng)論 1 297
  • 正文 為了忘掉前任衙解,我火速辦了婚禮阳柔,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘蚓峦。我一直安慰自己舌剂,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,724評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布暑椰。 她就那樣靜靜地躺著霍转,像睡著了一般。 火紅的嫁衣襯著肌膚如雪一汽。 梳的紋絲不亂的頭發(fā)上避消,一...
    開(kāi)封第一講書人閱讀 52,328評(píng)論 1 310
  • 那天,我揣著相機(jī)與錄音召夹,去河邊找鬼岩喷。 笑死,一個(gè)胖子當(dāng)著我的面吹牛监憎,可吹牛的內(nèi)容都是我干的纱意。 我是一名探鬼主播,決...
    沈念sama閱讀 40,897評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼鲸阔,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼妇穴!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起隶债,我...
    開(kāi)封第一講書人閱讀 39,804評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤腾它,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后死讹,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體瞒滴,經(jīng)...
    沈念sama閱讀 46,345評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,431評(píng)論 3 340
  • 正文 我和宋清朗相戀三年赞警,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了妓忍。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,561評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡愧旦,死狀恐怖世剖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情笤虫,我是刑警寧澤旁瘫,帶...
    沈念sama閱讀 36,238評(píng)論 5 350
  • 正文 年R本政府宣布祖凫,位于F島的核電站,受9級(jí)特大地震影響酬凳,放射性物質(zhì)發(fā)生泄漏惠况。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,928評(píng)論 3 334
  • 文/蒙蒙 一宁仔、第九天 我趴在偏房一處隱蔽的房頂上張望稠屠。 院中可真熱鬧,春花似錦翎苫、人聲如沸权埠。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 32,417評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)攘蔽。三九已至粱快,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間叔扼,已是汗流浹背事哭。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,528評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留瓜富,地道東北人鳍咱。 一個(gè)月前我還...
    沈念sama閱讀 48,983評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像与柑,于是被迫代替她去往敵國(guó)和親谤辜。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,573評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容

  • 方法1 (數(shù)據(jù)類型)(最小值+Math.random()*(最大值-最小值+1)) 例: (int)(1+Math...
    GB_speak閱讀 41,022評(píng)論 2 6
  • 國(guó)家電網(wǎng)公司企業(yè)標(biāo)準(zhǔn)(Q/GDW)- 面向?qū)ο蟮挠秒娦畔?shù)據(jù)交換協(xié)議 - 報(bào)批稿:20170802 前言: 排版 ...
    庭說(shuō)閱讀 11,005評(píng)論 6 13
  • 本文根據(jù)眾多互聯(lián)網(wǎng)博客內(nèi)容整理后形成价捧,引用內(nèi)容的版權(quán)歸原始作者所有丑念,僅限于學(xué)習(xí)研究使用,不得用于任何商業(yè)用途结蟋。 隨...
    深紅的眼眸閱讀 2,223評(píng)論 0 0
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理脯倚,服務(wù)發(fā)現(xiàn),斷路器嵌屎,智...
    卡卡羅2017閱讀 134,702評(píng)論 18 139
  • 1.選中項(xiàng)目工程 -> PROJECT ->Localizations 點(diǎn)擊下面的+號(hào)選擇支持的語(yǔ)言包 2.com...
    AlexCorleone閱讀 205評(píng)論 0 0