[分享] c++11 <random> 粗淺心得
<random> library
http://www.cplusplus.com/reference/random/
#include <random>
// 名稱空間直接使用 std
◎這東西對科學計算有啥用?一言以蔽之:
讓你以 randomNumber = distribution(generator) 的語法
簡單生成"符合各種分配"的隨機數。
註:distribution 跟 generator 只是方便理解的概念,並非正式的物件類別。
對於這兩種情境應該有蠻大的幫助:
1.純 c++ 環境的計算
2.製作 mex 檔,但不想或不知如何調用 MATLAB 的隨機函數時
◎ <random>主要提供兩種物件
(1) "generator":基於各種演算法的隨機數產生器,例如
物件類別(省略std::) 說明
default_random_engine (預設引擎)
mt19937(_64) Mersenne Twister 19937 (64 bit)
linear_congruential_engine x = (a*x + c) mod m
random_device 真隨機數產生器
關於 random_device ,是由硬體設備(例如熱雜訊)產生的真隨機數,
但生成速度可能比偽隨機數的生成慢上十倍,且需硬體支援。
若有硬體支援,則 random_device 物件的 .entropy() 會返回非零值。
(2) "distribution":即隨機數所服從的分配。
它們是 template class,所以要輸入<變數類型>及分配的參數。
例如一個 m=0, s=1 的 lognormal distribution 物件,
會以下列方式宣告
lognormal_distribution<double> lndist(0,1);
注意 m=0, s=1 指的是「其所對應的常態分配」為 N(0,1),
使用前應注意文件說明。
另外,這些分配物件的用途只有一個,就是產生隨機數。
其他作業如計算累積機率,
或者計算各階 moment 等分配本身的性質,都是不可行的。
◎ 整合 distribution、generator 與 system time seeding
// 共三步:
// 1.declare and seed the generator
// 2.declare the distribution
// 3.randomNumber = distribution(generator), so simple!
以 LN(0,1) 分配跟 mt19937 引擎為例,程式碼大概會像這樣:
double a;
std::mt19937 gen(static_cast<unsigned long>(duration_cast<nanoseconds>
(system_clock::now().time_since_epoch()).count()));
std::lognormal_distribution<double> dist(0, 1);
a = dist(gen);
(updated 2017.10.03)
範例程式碼:
https://gist.github.com/cbhuang/cfac5b4f31c2f037026f157b018e0e82
(同一份,在ideone上執行)
https://ideone.com/De11nm
* 測試時距->整數的轉型
* 測試偽隨機數引擎與 random_device 的生成效率
注意這些結果是platform-dependent。
如果自己在 linux 下編譯,應安裝g++,並指定使用c++11標準。
指令如下
g++ -std=c++11 chrono_random.cpp
同目錄下產生 a.out,直接執行即可(./a.out)
--
╲◥▊████ ◥█╲█▆▆▆ ╲█████ ╲█▆▆▆█ ◥◣◥◣ real㊣█
◥█▉█▅▅█ ╲◣ ▇▇▇▇ ◥█╲█╲▊ ╲▆▊╲█▆ ◥▁◣▁ temper
╲╲▊█▅▅█ ◥█ █▌╲█ ╲▆▆▆▆▆ ▇▇▇▇▇ ◥◣ ◥◣ █
◥█▊▇▆▇▆ ╲◣█████ ╲▆▆█▆█ █╲█╲█ ◥£▏ ◥£ █
╲╲▊▆▆█▆ █◥█▌╲█ ◥▆▆█▆█ █████ ◥◣◥◣ █
◥█▊▆▆█▆ ◥█ ◥███ ◥▇█ ◥█▅▅▅▇ ◥ ◥ █
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 114.27.17.103
推
06/27 08:56, , 1F
06/27 08:56, 1F
→
06/27 11:42, , 2F
06/27 11:42, 2F
→
06/27 16:26, , 3F
06/27 16:26, 3F
→
06/27 16:27, , 4F
06/27 16:27, 4F
2017.10.03更新連結於上
→
06/28 02:44, , 5F
06/28 02:44, 5F
→
06/29 06:08, , 6F
06/29 06:08, 6F
推
01/15 13:13, , 7F
01/15 13:13, 7F
※ 編輯: realtemper (1.164.6.63), 10/03/2017 01:01:23