1.1 rng
rng類是opencv裡c++的隨機數產生器。它可產生乙個64位的int隨機數。目前可按均勻分布和高斯分布產生隨機數。隨機數的產生採用的是multiply-with-carry演算法和ziggurat演算法。
1.1.1 產生乙個隨機數
rng可以產生3種隨機數
rng(int seed) 使用種子seed產生乙個64位隨機整數,預設-1
rng::uniform( ) 產生乙個均勻分布的隨機數
rng::gaussian( ) 產生乙個高斯分布的隨機數
rng::uniform(a, b ) 返回乙個[a,b)範圍的均勻分布的隨機數,a,b的資料型別要一致,而且必須是int、float、double中的一種,預設是int。
rng::gaussian( σ) 返回乙個均值為0,標準差為σ的隨機數。
如果要產生均值為λ,標準差為σ的隨機數,可以λ+ rng::gaussian( σ)
//建立rng物件,使用預設種子「-1」
rng rng;
//產生64位整數
int n1 = rng;
/*-------------產生均勻分布的隨機數uniform和高斯分布的隨機數gaussian---------*/
//總是得到double型別資料0.000000,因為會呼叫uniform(int,int),只會取整數,所以只產生0
double n1a = rng.
uniform(0
,1);
//產生[0,1)範圍內均勻分布的double型別資料
double n1b = rng.
uniform((
double)0
,(double)1
);//產生[0,1)範圍內均勻分布的float型別資料,注意被自動轉換為double了。
double n1c = rng.
uniform
(0.f
,1.f);
//產生[0,1)範圍內均勻分布的double型別資料。
double n1d = rng.
uniform(0.
,1.);
//可能會因為過載導致編譯不通過(確實沒通過。。)
//double n1e = rng.uniform(0,0.999999);
//產生符合均值為0,標準差為2的高斯分布的隨機數
double n1g = rng.
gaussian(2
);
1.1.2 返回下乙個隨機數
上面一次只能返回乙個隨機數,實際上系統已經生成乙個隨機數組。如果我們要連續獲得隨機數,沒有必要重新定義乙個rng類,只需要取出隨機數組的下乙個隨機數即可。
rng:: next 返回下乙個64位隨機整數
rng:: operator 返回下乙個指定型別的隨機數
rng rng;
int n2 = rng.
next()
;//返回下乙個隨機整數,即n1.next();
//返回下乙個指定型別的隨機數
int n2a = rng.
operator
uchar()
;//返回下乙個無符號字元數
int n2b = rng.
operator
schar()
;//返回下乙個有符號字元數
int n2c = rng.
operator
ushort()
;//返回下乙個無符號短型
int n2d = rng.
operator
short
int();
//返回下乙個短整型數
int n2e = rng.
operator
int();
//返回下乙個整型數
int n2f = rng.
operator
unsigned
int();
//返回下乙個無符號整型數
int n2g = rng.
operator
float()
;//返回下乙個浮點數
int n2h = rng.
operator
double()
;//返回下乙個double型數
int n2i = rng.
operator()
();//和rng.next( )等價
int n2j = rng.
operator()
(100);
//返回[0,100)範圍內的隨機數
1.1.3 用隨機數填充矩陣 rng::fill( )
void fill( inputoutputarray mat, int disttype, inputarray a, inputarray b, bool saturaterange=false );
inputoutputarray 輸入輸出矩陣,最多支援4通道,超過4通道先用reshape()改變結構
int disttype uniform 或 normal,表示均勻分布和高斯分布
inputarray a distype是uniform,a表示為下界(閉區間);distype是normal,a均值
inputarray b distype是uniform,b表示為上界(開區間);distype是normal,b標準差
bool saturaterange=false 只針對均勻分布有效。當為真的時候,會先把產生隨機數的範圍變換到資料型別的範圍,再產生隨機數;
如果為假,會先產生隨機數,再進行截斷到資料型別的有效區間。請看以下fillm1和fillm2的例子並觀察結果
//產生[1,1000)均勻分布的int隨機數填充fillm
mat_<
int>
fillm(3
,3);
rng.
fill
(fillm,rng::uniform,1,
1000
);
cout <<
"film = "
<< fillm << endl << endl;
mat fillm1(3
,3,cv_8u)
; rng.
fill
(fillm1,rng::uniform,1,
1000
,true)
; cout <<
"film1 = "
<< fillm1 << endl << endl;
mat fillm2(3
,3,cv_8u)
; rng.
fill
(fillm2,rng::uniform,1,
1000
,false)
; cout <<
"film2 = "
<< fillm2 << endl << endl;
//fillm1產生的資料都在[0,,255)內,且小於255;
//fillm2產生的資料雖然也在同樣範圍內,但是由於用了截斷操作,所以很多資料都是255,
//產生均值為1,標準差為3的隨機double數填進filln
mat_<
double
>
filln(3
,3);
rng.
fill
(filln,rng::normal,1,
3); cout <<
"filn = "
<< filln << endl << endl;
1.1.4
使用時間戳作為種子數
rng rng((
unsigned
)time
(null))
;//當然,用這個要記得加上頭函式
double x=rng.
uniform((
double)0
,(double
)255);
float y=rng.
uniform
(0.f
,255.f);
int z=rng.
uniform((
int)0,
(int
)255
);
每次執行生成的隨機數都不一樣哦~
看結果~
隨機數產生器RNG
用opencv做演算法的朋友們肯定為隨機數煩惱過,新版本一直支援隨機數產生器啦,而且還繼續支援之前版本的c格式的函式,不過與時俱進,我這裡介紹c 的rng類。它可以壓縮乙個64位的i整數並可以得到scalar和array的隨機數。目前的版本支援均勻分布隨機數和gaussian分布隨機數。隨機數的產生...
隨機數產生器RNG
用opencv做演算法的朋友們肯定為隨機數煩惱過,新版本一直支援隨機數產生器啦,而且還繼續支援之前版本的c格式的函式,不過與時俱進,我這裡介紹c 的rng類。它可以壓縮乙個64位的i整數並可以得到scalar和array的隨機數。目前的版本支援均勻分布隨機數和gaussian分布隨機數。隨機數的產生...
opencv隨機數發生器RNG
用opencv做演算法的朋友們肯定為隨機數煩惱過,新版本一直支援隨機數產生器啦,而且還繼續支援之前版本的c格式的函式,不過與時俱進,我這裡介紹c 的rng類。它可以壓縮乙個64位的i整數並可以得到scalar和array的隨機數。目前的版本支援均勻分布隨機數和gaussian分布隨機數。隨機數的產生...