我有关于RNG课程的问题.我想从给定的图像中随机获得不同的点,因此我使用OpenCV文档中推荐的RNG类.代码是:
struct SingleAnt
{
int row;
int col;
};
void initializeAnts( SingleAnt *ants, Mat *sourceImage )
{
RNG rng( 0xFFFFFFFF );
int imgWidth = sourceImage->cols;
int imgHight = sourceImage->rows;
for( int index = 0; index < ANTSNUMBER; index++ ) {
ants[ index ].col = rng.uniform( 0, imgWidth );
ants[ index ].row = rng.uniform( 0, imgHight );
}
}
Run Code Online (Sandbox Code Playgroud)
但是,当我运行此代码时,我每次都得到相同的结果.代码中有错误吗?
RNG rng( 0xFFFFFFFF );
Run Code Online (Sandbox Code Playgroud)
在这里,您(可能)在每次代码运行时为PRNG提供种子值 - 特别是相同的种子值(0xFFFFFFFF).因此,PRNG(作为一种完全确定的算法)每次都会提供相同的输出值序列.
相反,您应该为它提供伪随机种子值.通常,系统time()值用于为PRNG播种.很多时候,为PRNG调用无参数构造函数实际上是为您做的.
正如B ... 指出的那样,cv::RNG该类确实有一个无参数构造函数:cv::RNG::RNG()但它不会为生成器播种.从文档,RNG::RNG()只
将状态设置为某个预定义值,在当前实现中等于2**32-1
正如我之前建议的那样,你应该自己播种.
| 归档时间: |
|
| 查看次数: |
1003 次 |
| 最近记录: |