C++ normal_distribution高斯正態(tài)分布函數(shù)的用法示例
圖 1 顯示的是正態(tài)(或高斯)分布。它是一條連續(xù)的貝爾曲線,期望兩邊的值是相等的,可以理解為期望就是平均值。它是一個(gè)概率分布,因此曲線下方的面積是1。正態(tài)分布是由兩個(gè)參數(shù)完全定義的:期望和標(biāo)準(zhǔn)差,它們是衡量期望兩邊的值如何分布的一種方式。
圖 1 正態(tài)分布
期望和標(biāo)準(zhǔn)差分別是用希臘字母 μ 和 σ 來表示的,變量 x 有 n 個(gè)樣本,這些是由下面的公式定義的:
因此,期望就是值的和除以值的個(gè)數(shù)一換句話說,也就是平均值。可以通過值和期望的差值的平方子和除以 n-1,然后對(duì)結(jié)果開方來得到標(biāo)準(zhǔn)差。對(duì)于不同的期望和標(biāo)準(zhǔn)差的值,正態(tài)分布的相對(duì)寬度和高度分布曲線的變化是相當(dāng)大的。但是,分布值總是如圖 1 所示。這意味著,如果知道一個(gè)符合正態(tài)分布的變量的期望和標(biāo)準(zhǔn)差,例如在大量人口中個(gè)體的身高,就可以知道 95% 的人身高不超過期望的 2σ。標(biāo)準(zhǔn)正態(tài)分布的期望為 0,標(biāo)準(zhǔn)差為 1。
uniform_distribution 模板定義了可以產(chǎn)生隨機(jī)浮點(diǎn)值的分布對(duì)象類型,默認(rèn)是 double 類型。默認(rèn)構(gòu)造函數(shù)創(chuàng)建的是標(biāo)準(zhǔn)正態(tài)分布,因此期望是 0,方差是 1.0:
std::normal_distribution<> dist; // mu: 0 sigma: 1
下面展示了如何創(chuàng)建一個(gè)有特定值和標(biāo)準(zhǔn)差的正態(tài)分布:
double mu {50.0}, sigma {10.0}; std::normal_distribution<> norm {mu, sigma};
這里定義了一個(gè)生成 double 值的分布對(duì)象,期望為 50.0,標(biāo)準(zhǔn)差是 10.0。為了生成值,可以將一個(gè)隨機(jī)數(shù)生成器傳給 norm 函數(shù)對(duì)象。例如:
std::random_device rd; std::default_random_engine rng {rd()}; std::cout << "Normally distributed values: "<< norm (rng) << " " << norm (rng) << std::endl; // 39.6153 45.5608
可以通過調(diào)用對(duì)象的成員函數(shù) mean() 和 stddev() 來獲取它的期望值和標(biāo)準(zhǔn)差:
std::cout<<"mu: "<< norm.mean () << " sigma: " << norm.stddev ()<< std::endl; // mu: 50 sigma: 10
通過調(diào)用無參數(shù)的成員函數(shù) param(),可以得到一個(gè)封裝了這兩個(gè)值的 param_type 對(duì)象。為了設(shè)置期望或標(biāo)準(zhǔn)差,需要將一個(gè) param_type 對(duì)象傳給成員函數(shù) Pamm()。分布類有用來獲取期望和標(biāo)準(zhǔn)差的成員,param_type 對(duì)象擁有和它們的名字相同的成員函數(shù)。下 面是一個(gè)示例:
using Params = std::normal_distribution<>::param_type; // Type alias for readability double mu {50.0}, sigma {10.0}; std::normal_distribution<> norm {mu, sigma};// Create distribution auto params = norm.param(); // Get mean and standard deviation norm.param(Params {params.mean(),params.stddev() + 5.0}); // Modify params std::cout << "mu: "<< norm.mean() << " sigma: " << norm.stddev ()<< std::endl; // mu: 50 sigma: 15
這里調(diào)用無參數(shù)的 param() 來獲取包含期望和方差的 param_type 對(duì)象。在第二個(gè) param() 調(diào)用中,通過傳入一個(gè) Pams 對(duì)象將標(biāo)準(zhǔn)差增加了 5.0。
可以通過傳入一個(gè) param_type 對(duì)象作為一個(gè)分布對(duì)象調(diào)用的第二個(gè)參數(shù)來臨時(shí)設(shè)置期望和標(biāo)準(zhǔn)差:
using Params = std::normal_distribution<>::param_type; // Type alias for readability std::random_device rd; std::default_random_engine rng {rd()}; std::normal_distribution<> norm {50.0, 10.0}; // Create distribution Params new_p {100.0, 30.0};// mu=100 sigma=30 std::cout << norm(rng, new_p) << std::endl; // Generate value with new_p: 100.925 std::cout << norm,mean() << " " << norm.stddev()<< std::endl;// 50 10
new_p 定義的期望和標(biāo)準(zhǔn)差只會(huì)被應(yīng)用到它被作為第二個(gè)參數(shù)傳入的 norm 的執(zhí)行中。原始的期望和標(biāo)準(zhǔn)差會(huì)被應(yīng)用到隨后的沒有第二個(gè)參數(shù)的 norm 調(diào)用中。
成員函數(shù) min() 和 max() 返回的是分布可以產(chǎn)生的最小值和最大值。對(duì)于分布來說,這并不是特別有用。因?yàn)榉祷刂档念愋涂梢赃@樣表示最大值和最小值:
std::cout << "min: " << norm.min () << " max: " << norm.max ()<< std::endl; // min:4.94066e-324 max: 1.7 9769e+308
總結(jié)
到此這篇關(guān)于C++ normal_distribution高斯正態(tài)分布函數(shù)的文章就介紹到這了,更多相關(guān)C++ normal_distribution高斯正態(tài)分布函數(shù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C語言結(jié)構(gòu)體版學(xué)生成績(jī)管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C語言結(jié)構(gòu)體版的學(xué)生成績(jī)管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-02-02C語言實(shí)現(xiàn)掃雷游戲(可以自動(dòng)展開)
這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)掃雷游戲,可以自動(dòng)展開,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-11-11