隨機數生成 —— random
c++11 后,c++ 標准提供了與隨機數生成相關的標准庫來取代之前 c 語言中提供的 random(), rand() 等偽隨機函數的功能。可在源文件中通過頭文件 random 使用其提供的一些列隨機相關的類和函數的功能。
#include<random> //包含頭文件 random
c++ 提供的隨機數生成庫包含有兩個主要組成部分,隨機數生成引擎類和隨機數分布類。不同的隨機數生成引擎類主要根據不同的隨機數生成算法生成隨機數,而隨機數分布類則可根據隨機數生成引擎生成的隨機數轉換為對應數據分布的輸出,比如將生成的隨機數轉換為符合某種正態分布的輸出。
c++ 標准庫提供的是隨機數生成引擎的類模板,需進行對應的實例化。這里主要以練習中用到的隨機數生成引擎類 default_random_engine 的使用來舉例。標准庫中定義了很多預定義的隨機數生成器( 為生成器類,根據標准庫提供的隨機數生成器模實例化得到的),可以見這里,其中一個隨機數生成器會被指定為 default_random_engine,其使用方法也比較普適。
/*-定義隨機數引擎對象-*/ std::default_random_engine e; //默認初始化隨機數引擎狀態,注意對命名空間的聲明 std::default_random_engine e(s); //整形初始化隨機數引擎狀態 std::default_random_engine e(n); //使用同類型的隨機數引擎 n 初始化
隨機數生成引擎調用時返回值為一個無符號整形,常用的對隨機數引擎的操作如下。
e.max() //該引擎可生成的最大值 e.min() //該引擎可生成的最小值 e() //對 () 重載的調用,不接受參數,e 更新狀態,返回生成的隨機數
隨機數生成引擎生成的隨機數一般范圍不確定,難以滿足某些需要確定范圍隨機數的需求。標准庫另外提供了一系列的隨機數分布,可對隨機數生成引擎生成的隨機數進行轉換,從而產生對應的符合特定范圍和分布的隨機數,從而滿足特定應用的需求。
這里主要以生成浮點數均勻分布的 uniform_real_distribution 為例,介紹下隨機數分布的使用。
/*-定義隨機分布對象-*/ std::uniform_real_distribution<> u; //默認初始化,使用默認模板實參,為 double 類型 std::uniform_real_distribution<double> u; //默認初始化,生成范圍為[ 0.0, 1.0 ) std::uniform_real_distribution<double> u( a, b ); //double 型的均勻分布類,其生成數的值域為[ a, b )
使用隨機數分布的方法如下。
u(e) //調用 () 重載,以某個隨機數生成引擎(的引用)作為參數,返回位於對應分布內的隨機數 u.max() //分布范圍的最大值 u.min() //分布范圍的最小值
注意,一個給定的隨機數分布生成的隨機數序列總是相同的,隨意想要保證生成的隨機性,應該保證隨機數生成器總是存在( 狀態總是向后更新 )而不是重新開始( 從一個相同的起始狀態生成相同的隨機數序列 ),或者總是使用不同的種子值來初始化隨機數生成器的狀態。
參考來源:
Pseudo-random number generation - cppreference
17.4 隨機數 - c++ primer
復數類 —— complex
通過頭文件 complex 使用 c++ 提供的復數庫。
#include<complex> //包含頭文件 complex using std::complex; //注意聲明 complex 位於命名空間 std 中
c++ 提供了關於復數的類模板 complex,其使用兩個類型相同的變量如 a 和 b 分別表示復數的實部和虛部,即表示復數 a + bi.可通過 float、double 和 long double 來實例化 complex 類模板從而獲得使用對應的數據類型表示復數的 complex 類。可通過 typedef 定義來簡化對復數類的使用。
typedef complex<float> f_complex; //f_complex 為實/虛部均為 float 類型的復數類 typedef complex<double> d_complex; //d_complex 為實/虛部均為 double 類型的復數類 typedef complex<long double> ld_complex; //ld_complex 為實/虛部均為 long double 類型的復數類
常用的構造函數
f_complex a; //默認初始化,實部和虛部被設置為 0.0 f_complex a( 1.0, 2.0 ); //使用 1.0 初始化實部,使用 2.0 初始化虛部 f_complex a( b ); //拷貝初始化,使用一個同為 f_complex 的復數對象 b 初始化復數對象 a
部分所支持的函數
//成員函數 real //返回實部 img //返回虛部 //非成員函數 operator*/+/- //復數加減運算重載 abs( x ) //返回復數的模 exp( x ) //計算以 e 為底,參數 x 為冪的結果 pow( x , y ) //計算 x^y
std::complex - zh.cppreference.com