一、概念
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之間。