隨機數RNG使用說明

2021-09-29 13:28:23 字數 3734 閱讀 7600

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 的資料型別要一致,而且必須是intfloatdouble中的一種,預設是int

cv::rng::gaussian( σ)返回乙個均值為 0

00,標準差為 σ

σσ 的隨機數。如果要產生均值為λ

λλ,標準差為 σ

σσ 的隨機數,可以λ + 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 disttypeuniform 或 normal,表示均勻分布和高斯分布。

inputarray adistype是uniform,a表示為下界(閉區間);distype是normal,a均值。

inputarray bdistype是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...