[分享] c++11 <random> 粗淺心得

看板C_and_CPP作者 (實中最後台客)時間11年前 (2013/06/27 06:04), 6年前編輯推噓2(205)
留言7則, 6人參與, 最新討論串1/1
<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
連這個也標準化了啊 C++ 真強大 XD
06/27 08:56, 1F

06/27 11:42, , 2F
這個TR1就有了,所以沒C++11環境的別難過,可以看有沒有TR1
06/27 11:42, 2F

06/27 16:26, , 3F
http://ideone.com/u20Wu0 建議用這個貼程式碼
06/27 16:26, 3F

06/27 16:27, , 4F
本身就有c++11環境可以選擇,能直接跑程式
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
文章代碼(AID): #1HosLScT (C_and_CPP)