OpenCV随机数生成

2014-11-24 09:07:22 · 作者: · 浏览: 1

一、概念


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


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之间。