#include<stdlib.h> // 產生隨機數,範圍在0~RAND_MAX之間,RAND_MAX在stdlib中,其值爲2147483647 rand();
rand的機制是根據一個隨機數種子(一般是一個整數值,若是沒有設置,則爲默認值)來生成一系列指定順序的隨機數,若是種子相同,那麼一系列的隨機數也是相同的。因此若是你rand();
後再rand();
就會獲得同樣的。html
原理:
Srand ( );
和Rand( );
函數。它本質上是利用線性同餘法,y=ax+b(mod m);
其中a,b,m都是常數。所以rand的產生決定於x,x被稱爲Seed。ios
能夠經過srand()來設置隨機數種子。較爲廣泛的作法是將隨機數種子設爲time()的時間函數,這樣就能根據當前的時間來設置隨機數種子,不會存在重複的問題。c++
time()包含在time.h中,返回從一個特定時刻到如今通過了多少秒,它接受單個指針參數,用於指向寫入時間的數據結構,若爲空,則簡單的返回時間。用於產生隨機數種子一般用time(0);
數據結構
若是你要獲取必定範圍內的隨機數,rand() % MAX
,MAX爲你設置的範圍。能夠#define random(x) (rand()%x)
來簡化使用過程,使用時就直接rand(max);
就行了dom
#include<random> // 隨機數庫:由引擎類和分佈類組成 std::default_random_engine e;// 隨機數引擎,生成隨機無符號數e(); // 取出隊列頭的隨機數
和rand()函數相似,也是依靠隨機數種子,種子能夠在初始化時指定std::default_random_engine e(seed);
(seed爲整型值);也能夠調用seed()成員函數指定e.seed(seed);
函數
標準庫定義了多個隨機數引擎類,區別在於性能和隨機性質量不一樣,每一個編譯器都會指定其中一個做爲default_random_engine類型。此類型通常具備最經常使用的特性。有興趣的請自行了解「標準庫隨機數引擎」。性能
隨機數引擎操做 | 介紹 |
---|---|
Engine e; | 默認構造函數 |
Engine e(s) | 使用整型值s爲種子 |
e.seed(s) | 使用種子s重置引擎的狀態 |
e.min() | 此引擎可生成的最小值 |
e.max() | 此引擎可生成的最大值 |
Engine::result_type | 此引擎生成的unsigned整型類型 |
e.discard(u) | 將引擎推動u步;u的類型爲unsigned long long |
參考:c++primer第5版中文版P660,英文P746spa
分佈得靠本身去處理.net
double cls_random::randomExponential( double lambda){ double pV = 0.0; while(true) { pV = (double)rand()/(double)RAND_MAX; if (pV != 1) { break; } } pV = (-1.0/lambda)*log(1-pV); return pV;}
指望:E=\lambda^{-1}\
方差:V=\lambda^{-2}\
此方法的參考網址指針
標準庫定義了一系列的分佈類型,分佈就是在隨機數引擎產生的隨機數的基礎上進行過濾調整,以符合必定的規律,下面以正態分佈的使用爲例
#include <iostream> #include <random> #include <string> using namespace std; int main(){ default_random_engine e;// 生成隨機整數 normal_distribution<double> n(4,1.5);// 均值4,標準差1.5 int vals[9]; for(size_t i = 0;i != 200;i++) { // n(e)獲得正態分佈的double值 // lround將double舍入到最近的整型值 int v = lround(n(e)); if(v<9)//若是結果在範圍內 { ++vals[v];// 統計每一個數出現了多少次 } } for(int j = 0;j != 9;j++ ) { // 打印每一個數出現的頻率 cout<< j << ":" << string(vals[j], '*') <<endl; }}
0:*
1:*
2:**
3:**
4:*
5:**
6:**
7:*
8:*
隨機數分佈
分佈類 | 介紹 |
---|---|
均勻分佈: | |
uniform_int_distribution<IntT> u(m,n) |
均勻分佈的模板類,m爲生成的最小值,n最大,生成int |
uniform_real_distrubution<RealT> u(x,y) |
同上,生成double |
伯努利分佈: | |
bernoulli_distribution b(p) |
伯努利分佈,以給定機率p生成true,默認0.5 |
binomial_distribution<IntT> b(t,p) |
按採樣大小爲整型值t,機率爲p生成的;t默認1,p默認0.5 |
geometric_distribution<IntT> g(p) |
每次實驗成功的機率爲p,p的默認值爲0.5 |
negative_binomial_distribution<IntT>nb(k,p) |
k(整型值)次實驗成功的機率爲p;k默認爲1,p默認0.5 |
泊松分佈: | |
poisson_distribution<IntT>p(x) |
均值爲double值x的泊松分佈 |
exponential_distribution<RealT> e(lam) |
指數分佈,參數lambda經過腹地安置lam給出,lan默認爲1.0 |
gamma_distribution<RealT> e(a,b) |
alpha(形狀參數)爲a,beta(尺度參數)爲b;默認值均爲1.0 |
weibull_distribution<RealT> w(a,b) |
形狀參數爲a,尺度參數爲b;默認1.0 |
extreme_value__distribution<RealT>e(a,b) |
a的默認值爲0.0,b的爲1.0 |
正態分佈: | |
normal_distribution<RealT>n(m,s) |
均值爲m,標準差爲s;m默認爲0,s默認1.0 |
lognarmal_distribution<RealT> ln(m,s) |
均值爲m,標準差爲s;m的默認值爲0.0,s的默認值爲1.0 |
chi_squared_distribution(RealT)c(x) |
自由度爲x,默認值爲1.0 |
cauchy_distribution<RealT>c(a,b) |
位置參數a和尺度參數b的默認值爲0.0和1.0 |
fisher_f_distribution<RealT>f(m,n) |
自由度爲m和n,默認值均爲1 |
student_t_distribution<RealT>s(n) |
自由度爲n;n默認爲1 |
抽樣分佈: | |
discrete_distribution<IntT>d(i,j) |
見下 |
discrete_distribution<IntT>d{ il } |
i和j是一個權重序列的輸入迭代器,il是一個權重的花括號列表。權重必須能轉換爲double |
piecewise_constant_distribution<RealT> pc(b,e,w) |
b,e,w是輸入迭代器 |
piecewise_linear_distribution<RealT> pl(b,e,w) |
b,e,w是輸入迭代器 |