在编程中用到了随机数,查到了下面这篇文章(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 )。
本文详细介绍了在OpenCV中如何使用随机数生成器,并强调了正确初始化随机数种子的重要性,以确保每次调用都能产生不同的随机数。此外,还提供了具体的函数说明和示例代码。
247

被折叠的 条评论
为什么被折叠?



