Opencv 中产生随机数种子的赋值

本文详细介绍了在OpenCV中如何使用随机数生成器,并强调了正确初始化随机数种子的重要性,以确保每次调用都能产生不同的随机数。此外,还提供了具体的函数说明和示例代码。

 

在编程中用到了随机数,查到了下面这篇文章(http://www.opencv.org.cn/index.php/Cxcore%E6%95%B0%E7%BB%84%E6%93%8D%E4%BD%9C#.E9.9A.8F.E6.9C.BA.E6.95.B0.E7.94.9F.E6.88.90),文章复制到下面,大家可以参考。但在使用中我发现了有个问题就是随机数种子

CvRNG 或者RNG定义好后,要使用系统时间或随机数产生器来赋值;这样当函数调用包含有产生随机数的函数时,才能保证每次调用中产生不同的随机数。示例如下:

CvRNG rng1 = (int64)GetTickCount64();
RNG rng = (int64)GetTickCount64();

CvMat *mId = cvCreateMat(1,L,CV_32S) ;

cvRandArr(&rng1,mId,CV_RAND_UNI,cvScalar(0),cvScalar(200));//产生随机数

        float t_f = rng.uniform(0.0,1.0);

原因:如果直接定义随机种子而没有赋值,系统会默认赋值为-1(可参加下面);这样每次调用都会从相同的种子开始产生随机数,所以每次调用获得值相同。

RNG

初始化随机数生成器状态

CvRNG cvRNG( int64 seed=-1 );  
seed
64-bit 的值用来初始化一个随机序列

函数 cvRNG 初始化随机数生成器并返回其状态。指向这个状态的指针可以传递给函数 cvRandInt, cvRandReal 和 cvRandArr . 在通常的实现中使用一个 multiply-with-carry generator 。

RandArr

用随机数填充数组并更新 RNG 状态

void cvRandArr( CvRNG* rng, CvArr* arr, int dist_type, CvScalar param1, CvScalar param2 );  
rng
被 cvRNG 初始化的 RNG 状态.
arr
输出数组
dist_type
分布类型:
CV_RAND_UNI - 均匀分布
CV_RAND_NORMAL - 正态分布 或者 高斯分布
param1
分布的第一个参数。如果是均匀分布它是随机数范围的闭下边界。如果是正态分布它是随机数的平均值。
param2
分布的第二个参数。如果是均匀分布它是随机数范围的开上边界。如果是正态分布它是随机数的标准差。

函数 cvRandArr 用均匀分布的或者正态分布的随机数填充输出数组。在下面的例子中该函数被用来添加一些正态分布的浮点数到二维数组的随机位置。

 

RandInt

返回 32-bit 无符号整型并更新 RNG

unsigned cvRandInt( CvRNG* rng );  
rng
被 cvRNG 初始化的 RNG 状态,被 RandSetRange (虽然, 后面这个函数对我们正讨论的函数的结果没有什么影响)随意地设置。

函数 cvRandInt 返回均匀分布的随机 32-bit 无符号整型值并更新 RNG 状态。它和 C 运行库里面的 rand() 函数十分相似,但是它产生的总是一个 32-bit 数而 rand() 返回一个 0 到 RAND_MAX (它是 2**16 或者 2**32, 依赖于操作平台)之间的数。

该函数用来产生一个标量随机数,例如点, patch sizes, table indices 等,用模操作可以产生一个确定边界的整数,人和其他特定的边界缩放到 0.. 1可以产生一个浮点数。下面是用 cvRandInt 重写的前一个函数讨论的例子:

 

RandReal

返回浮点型随机数并更新 RNG

double cvRandReal( CvRNG* rng );  
rng
被 cvRNG 初始化的 RNG 状态

函数 cvRandReal 返回均匀分布的随机浮点数,范围在 0..1 之间 (不包括 1 )。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值