opencv中用RNG產生隨機數

2021-10-04 09:41:53 字數 4432 閱讀 1373

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分布隨機數。隨機數的產生...