用opencv做演算法的朋友們肯定為隨機數煩惱過,新版本一直支援隨機數產生器啦,而且還繼續支援之前版本的c格式的函式,不過與時俱進,我這裡介紹c++的rng類。它可以壓縮乙個64位的i整數並可以得到scalar和array的隨機數。目前的版本支援均勻分布隨機數和gaussian分布隨機數。隨機數的產生採用的是multiply-with-carry演算法和ziggurat演算法。
其建構函式的初始化可以傳入乙個64位的整型引數作為隨機數產生器的初值。next可以取出下乙個隨機數,uniform函式可以返回指定範圍的隨機數,gaussian函式返回乙個高斯隨機數,fill則用隨機數填充矩陣。
這裡介紹乙個uniform的使用事項,就是比如利用它產生0~1的隨機數的問題,具體**如下:
[cpp]view plain
copy
rng rng;
// always produces 0
double
a = rng.uniform(0, 1);
// produces double from [0, 1)
double
a1 = rng.uniform((
double
)0, (
double
)1);
// produces float from [0, 1)
double
b = rng.uniform(0.f, 1.f);
// produces double from [0, 1)
double
c = rng.uniform(0., 1.);
// may cause compiler error because of ambiguity:
// rng::uniform(0, (int)0.999999)? or rng::uniform((double)0, 0.99999)?
double
d = rng.uniform(0, 0.999999);
就是不能寫成rng.uniform( 0 , 1),因為輸入為int型引數,會呼叫uniform(int,int),只能產生0。請大家注意使用^_^
還有一些隨機數相關的函式,比如randu可以產生乙個均勻分布的隨機數或者矩陣,randn可以產生乙個正態分佈的隨機數,randshuffle可以隨機打亂矩陣元素
下面是類rng的定義:
random number generator
the class implements rng using multiply-with-carry algorithm
*/
class cv_exports rng
;
rng();//預設建構函式
// inline rng::rng()
rng(uint64 state);//帶引數的建構函式,接受乙個64位無符號的值。
//inline rng::rng(uint64 _state)
//! updates the state and returns the next 32-bit unsigned integer random number
unsigned next();
/* inline unsigned rng::next()
#define cv_rng_coeff 4164903690u
用兩個很大的無符號數相乘,乘積結果要轉換為64位無符號數,轉換的時候兩個乘數應該向高精度看起,所以應該也先轉換為64位再相乘。把state右移32位得到乙個數,把這兩個數相加。函式返回乙個32位的無符號數,其值為截斷前面求得的和。
*/
//以下幾個函式是從類到uchar.schar,ushort,short,usinged的顯示轉換函式
operator uchar();//返回乙個8位無符號型別的隨機數,把next返回的數截斷
//inline rng::operator uchar()
operator schar();//返回乙個8為有符號型別的隨機數。???會產生負數嗎,返回的也是截斷的next返回值。莫非是截斷後得到的最高位作為符號位,這樣也可能是隨機的。???
//inline rng::operator schar()
operator ushort();//返回乙個無符號16為整數
//inline rng::operator ushort()
operator short();//返回乙個有符號16為整數
// inline rng::operator short()
operator unsigned();//返回乙個無符號32為整數
// inline rng::operator unsigned()
//! returns a random integer sampled uniformly from [0, n).
unsigned operator ()(unsigned n);//過載括號操作符,帶引數。在(0,n)之間返回乙個整數,呼叫uniform成員函式
//inline unsigned rng::operator ()(unsigned n)
unsigned operator ()();//過載括號操作符,無引數。直接返回next結果。
// inline unsigned rng::operator ()()
//放在這個位置有點奇怪,為什麼不和前邊同類放一起呢?放回乙個帶符//號32為整數
operator int();
// inline rng::operator int()
//返回乙個float型(具體多少位看平台)數。
operator float();
// inline rng::operator float()
//兩個數按位或一下,解釋起來好麻煩
operator double();
/* inline rng::operator double()
*/
//! returns uniformly distributed integer random number from [a,b) range
int uniform(int a, int b);//[a,b)內隨機產生乙個int型值,均勻的哦!
// inline int rng::uniform(int a, int b)
//! returns uniformly distributed floating-point random number from [a,b) range
float uniform(float a, float b); //[a,b)內隨機產生乙個float型值,均勻的哦!
// inline float rng::uniform(float a, float b)
//! returns uniformly distributed double-precision floating-point random number from [a,b) range
double uniform(double a, double b); //[a,b)內隨機產生乙個double型值,均勻的
// inline double rng::uniform(double a, double b)
void fill( inputoutputarray mat, int disttype, inputarray a, inputarray b, bool saturaterange=false );//這個函式實現很長,暫時略過。
//! returns gaussian random variate with mean zero.
double gaussian(double sigma);//返回均值為0的高斯隨機變數,
/*double rng::gaussian(double sigma)
*/
uint64 state;//種子,next中需要這樣乙個初始值
};
再簡單介紹一下c版本的隨機數產生器的相關函式,有cvrng、cvrandarr、cvrandint、cvrandreal
參考博文:隨機數產生器rng
隨機類rng
boost 隨機數發生器
在很多應用中都需要使用隨機數。本庫力求提供乙個高效的,通用的隨機數庫。boost庫有多種隨機數生成方式。先熟悉一下各種隨機數生成器的概念。數字生成器 number generator 它是乙個函式物件,沒有引數。類似於常見的rand 均勻隨機數生成器 uniform random number ge...
OpenCV學習 隨機數發生器 繪製文字
opencv tutorials學習 隨機數發生器 繪製文字 學習知識點 隨機數發生器 直線 折現 矩形 圓 圓弧等的繪製 文字的顯示 分析 例項化random number generator 隨機數發生器物件 rng rng的實現了乙個隨機數發生器。在上面的例子中,rng是用數值 0xfffff...
產生隨意隨機數發生器
怎樣利用給定的隨機數發生器產生其它隨意你想得到的隨機數發生器。假定給定的隨機數發生器是變數產生離散變數x 服從某一分布 比如均勻分布。高斯分布等等 隨意你想得到的隨機數發生器滿足分布 y,如果x和 y其概率密度分布函式分布為 g x h y 假定用x 隨機數發生器產生 y隨機數發生器,以下分為2步求...