关于C++中的随机数生成器
關(guān)于C++中的隨機(jī)數(shù)生成器
今天需要生成隨機(jī)序列來(lái)測(cè)試代碼,記錄一下C++中隨機(jī)數(shù)生成器的使用方法。
C++中使用random庫(kù)生成隨機(jī)數(shù),主要使用兩個(gè)類:
調(diào)用這個(gè)類會(huì)生成一個(gè)調(diào)用運(yùn)算符。
該運(yùn)算符不接受任何參數(shù),并返回一個(gè)隨機(jī)的unsigned整數(shù)。
常與隨機(jī)數(shù)分布類共同使用,很少單獨(dú)使用。
需要以隨機(jī)數(shù)引擎作為參數(shù)(即必須先定義隨機(jī)數(shù)引擎類)。
常用方法:
uniform_int_distribution :指定范圍的隨機(jī)非負(fù)數(shù)
uniform_real_distribution:指定范圍的隨機(jī)實(shí)數(shù)
bernoulli_distribution :指定概率的隨機(jī)布爾值
具體使用方法:
首先調(diào)用default_random_engine,生成一個(gè)random engine.
//首先生成一個(gè)random-number engine, 每次調(diào)用會(huì)返回一個(gè)unsigned int類型的數(shù)。cout << "Generate a random engine" << endl;default_random_engine e;for (int i = 0; i < 10; i++) {cout << e() << endl;}運(yùn)行結(jié)果:
再生成隨機(jī)分布類
先生成一個(gè)uniform_int_distribution類,
模板參數(shù)為要生成的隨機(jī)數(shù)類型(int, unsigned int, short, unsigned short, long, unsigned long, long long, unsigned long long);
構(gòu)造函數(shù)接受兩個(gè)參數(shù),表示生成隨機(jī)數(shù)的范圍。
調(diào)用時(shí)要以random engine為參數(shù)。
運(yùn)行結(jié)果:
uniform_real_distribution使用方法同上,只是生成的是實(shí)數(shù)。(float, double, long double)
cout << "generate uniform_real_distribution" << endl;uniform_real_distribution<float> dis2(0, 9);for (int i = 0; i < 10; i++) {cout << dis2(e) << endl;}運(yùn)行結(jié)果:
bernoulli_distribution不是模板類,它的構(gòu)造函數(shù)只有一個(gè)參數(shù),為該類返回true的概率,默認(rèn)為0.5。
該函數(shù)也需要接受random engine參數(shù)。
運(yùn)行結(jié)果:
設(shè)置seed
可以通過(guò)為random engine設(shè)置隨機(jī)數(shù)種子(seed)來(lái)控制生成隨機(jī)數(shù)的序列。若不設(shè)置seed,則random engine使用默認(rèn)種子。兩個(gè)使用默認(rèn)種子的engine生成的序列是相同的。
seed可以在構(gòu)造函數(shù)中給定,也可以在之后設(shè)置。
運(yùn)行結(jié)果:
下面設(shè)置e3和e4的seed=100
運(yùn)行結(jié)果:
從結(jié)果中可以觀察到:
e3生成的序列與e2相同,由于e2之前已經(jīng)生成了一個(gè)數(shù),e3生成的序列始終落后e2一個(gè)數(shù)。
由于e3和e4同時(shí)設(shè)置seed,二者生成的序列相同。
因此可以理解為:每次設(shè)置seed后random engine根據(jù)seed重新生成序列。
將系統(tǒng)時(shí)間設(shè)為seed
隨機(jī)數(shù)發(fā)生器并不是完全隨機(jī)的,每次運(yùn)行程序都會(huì)返回相同的數(shù)值序列。
這對(duì)調(diào)試非常友好,但是實(shí)際運(yùn)行時(shí)希望每次取得不同的隨機(jī)序列。
通常將系統(tǒng)時(shí)間設(shè)為seed,使得每次運(yùn)行的seed不同
樓豬是個(gè)菜雞,歡迎共同交流共同進(jìn)步。
總結(jié)
以上是生活随笔為你收集整理的关于C++中的随机数生成器的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 合并N个有序链表与FQ公平调度
- 下一篇: 宋宝华: kvmalloc ——倚天剑屠