我有使用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
答案 0 :(得分:1)
由于随机是基于时钟,如果你在循环中使用随机(速度非常快),时钟不会改变,你的数字都是一样的。
你应该添加一个暂停语句来让时钟发生变化。
答案 1 :(得分:0)
我的回答是使用c ++ 11随机库:std random functions not working - Qt MinGw
我没时间深入调查这个问题,所以这是解决这个问题的最简单方法。