Windows中的Qt qrand循环生成相同的数字

时间:2014-12-26 13:38:56

标签: c++ qt random

我有使用qml的qt应用程序。循环中的qrand工作错误,在代码中工作正常。这个问题 仅出现在Windows(在Windows 7和8中尝试使用MSVC2012_OpenGL_32bit)。这是一个例子:

在main.cpp开始时我打印:

QTime time = QTime::currentTime();
qsrand((uint)time.msec());

然后在循环中我使用qrand

for (int j = 0; j < 4; j++)
{
    for (int i = 0; i < 1000; i++)
    {
        int r1 = qrand() % 150;
        int r2 = qrand() % 150;
        qDebug() << r1 << r2 << endl;
    }
}

在输出中有2个不同的数字重复约200次,然后更改:

8 58
8 58
8 58
...
120 1
120 1
120 1
...

如果我不在循环中使用qrand,它可以正常工作。但是,如果我创建函数,那就用qrand生成随机数,这个函数运行错误。 在linux上的gcc 64位编译器上,相同的代码工作正常,它在每一行产生不同的数字。 在Windows 7和8中使用MSVC2012_OpenGL_32bit qrand工作错误。此外,我尝试了标准的srand和rand(),它也有效。我检查了(uint)time.msec(),它总是不同的。 但是,如果我把qsrand放入循环程序生成不完美,但不同的数字:

for (int j = 0; j < 4; j++)
{
    for (int i = 0; i < 1000; i++)
    {
        QTime time = QTime::currentTime();
        qsrand((uint)time.msec());
        int r1 = qrand() % 150;
        int r2 = qrand() % 150;
        qDebug() << r1 << r2 << endl;
    }
}

输出并不完美但是qrand只是更频繁地生成不同的数字,但并非总是如此。

更新 我在Windows中尝试了c ++ 11随机而且它有效。我还没在linux上试过它。但关于qrand的问题仍然存在。

我使用的c ++ 11随机: std random functions not working - Qt MinGw

2 个答案:

答案 0 :(得分:1)

由于随机是基于时钟,如果你在循环中使用随机(速度非常快),时钟不会改变,你的数字都是一样的。

你应该添加一个暂停语句来让时钟发生变化。

答案 1 :(得分:0)

我的回答是使用c ++ 11随机库:std random functions not working - Qt MinGw

我没时间深入调查这个问题,所以这是解决这个问题的最简单方法。