1

我对 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 );
    }
}

但是,当我运行此代码时,每次都会得到相同的结果。代码中是否有任何错误?

4

1 回答 1

5
RNG rng( 0xFFFFFFFF );

在这里,您(大概)为PRNG提供了一个种子值——特别是每次代码运行时都提供相同的种子值 ( )。0xFFFFFFFF因此,PRNG(作为一种完全确定的算法)每次都将提供相同的输出值序列。

相反,您应该为它提供一个伪随机种子值。通常,系统time()值用于播种 PRNG。很多时候,为 PRNG 调用无参数构造函数实际上会为您执行此操作。

正如B... 指出的那样,cv::RNG该类确实有一个无参数的构造函数:cv::RNG::RNG(),但它没有为生成器提供种子。从文档中,RNG::RNG()只有

将状态设置为某个预定义值,在当前实现中等于 2**32-1

因此,正如我之前建议的那样,您应该自己播种。

于 2013-11-12T03:56:13.547 回答