歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

OpenCV隨機數生成

一、概念

1.一般計算機的隨機數都是偽隨機數,以一個真隨機數(種子)作為初始條件,然後用一定的算法迭代產生隨機數序列。

2.隨機數的“種子”就是產生隨機數的第一次使用值,機制是通過一個比較復雜函數,將這個種子的值映射到隨機數空間的某一個點上,並且產生的隨機數均勻地(或者符合正態分布等)散步在空間中,以後產生的隨機數都與前一個隨機數有關。

3.RNG : random number generation  隨機數生成

二、opencv中的函數

1.CvRNG cvRNG(int64 seed);

使用64位長整形種子,初始化隨機數生成器狀態。

cvGetTickCount();

返回64位長整形的時間數據,在opencv中是為CvRNG設置的專用種子。

2.unsigned cvRandInt(CvRNG* rng);

返回均勻分布的隨機32位無符號整型值,並更新RNG的狀態; 使用模操作可以獲得確定邊界的整形數值。

3.double cvRandReal(CvRNG* rng);

返回均勻分布的隨即浮點數,范圍在0-1(不含1),並更新RNG的狀態。

4. voidcvRandArr( CvRNG* rng, CvArr* arr, int dist_type, CvScalar param1,CvScalar param2 );

用隨機數填充數組,並更新RNG的狀態

arr 輸出數組

dist_type 分布類型:  CV_RAND_UNI- 均勻分布  ; CV_RAND_NORMAL- 正態分布 或者 高斯分布

param1 分布的第一個參數。如果是均勻分布它是隨機數范圍的閉下邊界。如果是正態分布它是隨機數的平均值。

param2 分布的第二個參數。如果是均勻分布它是隨機數范圍的開上邊界。如果是正態分布它是隨機數的標准差。

先看一個例子

#include"cv.h"

#include"highgui.h"

#include<stdio.h>

intmain()

{

CvRNGrng=cvRNG(0);

inti=0;

for(i=0;i<5;i++)

printf("%d,",cvRandInt(&rng));

printf("\n");

for(i=0;i<5;i++)

printf("%f,",cvRandReal(&rng));

printf("\n");

}

cvGetTickCount()
返回64位長整數的時間數據,在OpenCV是為CvRNG設置的專用種子。

cvGetTickFrequency()

返回系統時鐘頻率

cvRNG()

跟一般的C語言srand()使用方法一樣,要先給它一個種子,但srand()用到的是unsignedint的32位種子范圍,而cvRNG()用的是64位長整數種子。初始化CvRNG資料結構,假如seed給0,它將會自動轉成-1。
cvRNG(64位種子)

cvRandInt()

返回均勻分布32位的隨機數,均勻分布為統計學上的專有名詞,表示長時間下所有數字出現的概率都是一樣的,而cvRandint()在opencv裡使用的公式

temp= (uint64)(unsigned)temp*1554115554 + (temp >> 32);

這個公式的名稱叫Multiply-with-carry(MWC)generator,有興趣的話可以在網絡上找“隨機數產生器”,Multiply-with-carry是將64位的種子去產生32位的隨機數。
unsignedcvRandInt(CvRNG資料結構)

cvRandReal()

返回均勻分布,0~1之間的隨機小數,cvRandReal()的公式則是用
cvRandInt(rng)*2.3283064365386962890625e-10
的方法,其實就是cvRandInt(rng)*2^(-32),也就是將cvRandInt()隨機出來的結果(32位除以2的三十二次方,因此,出現的結果將會是0~1之間的小數,也就是隨機0~1之間。

Copyright © Linux教程網 All Rights Reserved