为什么每次RNG的结果都相同?

zch*_*kui 0 c++ random opencv

我有关于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)

但是,当我运行此代码时,我每次都得到相同的结果.代码中有错误吗?

Jon*_*art 5

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

正如我之前建议的那样,你应该自己播种.