c++ 生成隨機數

一.獲取均勻分佈的隨機數

經典方法:


#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


c++11中的新標準:

#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

example指數分佈:

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}\
此方法的參考網址指針


c++11新標準:

  • 標準庫定義了一系列的分佈類型,分佈就是在隨機數引擎產生的隨機數的基礎上進行過濾調整,以符合必定的規律,下面以正態分佈的使用爲例


example

#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是輸入迭代器

隨機數引擎

隨機數引擎

相關文章
相關標籤/搜索