用OpenCV做算法的朋友們肯定為隨機(jī)數(shù)煩惱過(guò),,新版本一直支持隨機(jī)數(shù)產(chǎn)生器啦,而且還繼續(xù)支持之前版本的c格式的函數(shù),,不過(guò)與時(shí)俱進(jìn),,我這里介紹C++的RNG類(lèi)。它可以壓縮一個(gè)64位的i整數(shù)并可以得到scalar和array的隨機(jī)數(shù),。目前的版本支持均勻分布隨機(jī)數(shù)和Gaussian分布隨機(jī)數(shù),。隨機(jī)數(shù)的產(chǎn)生采用的是Multiply-With-Carry算法和Ziggurat算法。 其構(gòu)造函數(shù)的初始化可以傳入一個(gè)64位的整型參數(shù)作為隨機(jī)數(shù)產(chǎn)生器的初值,。next可以取出下一個(gè)隨機(jī)數(shù),,uniform函數(shù)可以返回指定范圍的隨機(jī)數(shù),gaussian函數(shù)返回一個(gè)高斯隨機(jī)數(shù),,fill則用隨機(jī)數(shù)填充矩陣,。 這里介紹一個(gè)uniform的使用事項(xiàng),就是比如利用它產(chǎn)生0~1的隨機(jī)數(shù)的問(wèn)題,,具體代碼如下:
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); 就是不能寫(xiě)成rng.uniform( 0 , 1),,因?yàn)檩斎霝閕nt型參數(shù),會(huì)調(diào)用uniform(int,,int),只能產(chǎn)生0,。請(qǐng)大家注意使用^_^ 還有一些隨機(jī)數(shù)相關(guān)的函數(shù),,比如randu可以產(chǎn)生一個(gè)均勻分布的隨機(jī)數(shù)或者矩陣,randn可以產(chǎn)生一個(gè)正態(tài)分布的隨機(jī)數(shù),,randShuffle可以隨機(jī)打亂矩陣元素 再簡(jiǎn)單介紹一下c版本的隨機(jī)數(shù)產(chǎn)生器的相關(guān)函數(shù),,有cvRNG、cvRandArr,、cvRandInt,、cvRandReal |
|