cv::rng
類是opencv裡c++的隨機數產生器。它可產生乙個64位的int隨機數。目前可按均勻分布和高斯分布產生隨機數。計算機產生的隨機數都是偽隨機數,是根據種子點seed和特定演算法計算出來的。所以,只要種子一定,演算法一定,產生的隨機數是一定的。
cv::rng
可以產生3種隨機數。
(1)rng(int seed)
使用種子seed
產生乙個64位隨機整數,預設-1。
(2)cv::rng::uniform( )
產生乙個均勻分布的隨機數。
(3)cv::rng::gaussian( )
產生乙個高斯分布的隨機數。
cv::rng::uniform(a, b )
返回乙個 [a,b)
[a,b)
[a,b
) 範圍的均勻分布的隨機數,a,b
a, b
a,b 的資料型別要一致,而且必須是
int
、float
、double
中的一種,預設是int
。
cv::rng::gaussian( σ)
返回乙個均值為 000,標準差為 σ
σσ 的隨機數。如果要產生均值為λ
λλ,標準差為 σ
σσ 的隨機數,可以
λ + cv::rng::gaussian(σ)
rng rng;
int randomnumber = rng;
cout << "randomnumber=" << randomnumber << endl;
>> randomnumber=130063606
double randomnumber = rng.uniform(0,99);
>> randomnumber=79
double randomnumber = rng.gaussian(2);
>> randomnumber=-3.20619e-09
上面一次只能返回乙個隨機數,實際上系統已經生成乙個隨機數組。如果我們要連續獲得隨機數,沒有必要重新定義乙個rng類,只需要取出隨機數組的下乙個隨機數即可。
(1)cv::rng:: next
返回下乙個64位隨機整數。
(2)cv::rng:: operator
返回下乙個指定型別的隨機數。
rng rng;
int randomnumber = rng.next(); //返回下乙個隨機整數,即n1.next();
//返回下乙個指定型別的隨機數
int randomnumber = rng.operator uchar(); //返回下乙個無符號字元數
int randomnumber = rng.operator schar(); //返回下乙個有符號字元數
int randomnumber = rng.operator ushort(); //返回下乙個無符號短型
int randomnumber = rng.operator short int(); //返回下乙個短整型數
int randomnumber = rng.operator int(); //返回下乙個整型數
int randomnumber = rng.operator unsigned int(); //返回下乙個無符號整型數
int randomnumber = rng.operator float(); //返回下乙個浮點數
int randomnumber = rng.operator double(); //返回下乙個double型數
int randomnumber = rng.operator ()(); //和rng.next( )等價
int randomnumber = rng.operator ()(100); //返回[0,100)範圍內的隨機數
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
只針對均勻分布有效。當為真的時候,會先把產生隨機數的範圍變換到資料型別的範圍,再產生隨機數。如果為假,會先產生隨機數,再進行截斷到資料型別的有效區間。
//產生[1,1000)均勻分布的int隨機數填充fillm
mat_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_filln(3,3);
rng.fill(filln,rng::normal,1,3);
cout << "filn = " << filln << endl << endl;
rng rng((unsigned)time(null));
當然,用這個要記得加上頭函式
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產生隨機數
1.1 rng rng類是opencv裡c 的隨機數產生器。它可產生乙個64位的int隨機數。目前可按均勻分布和高斯分布產生隨機數。隨機數的產生採用的是multiply with carry演算法和ziggurat演算法。1.1.1 產生乙個隨機數 rng可以產生3種隨機數 rng int seed...