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