我有一个QT应用程序,再运行2个帖子。
在线程内部,我使用qrand函数生成一个随机数。以下是用于获取数字的代码,其中m_fluctuations max是double。
int fluctuate = qrand() % (int)(m_FluctuationMax * 100);
我尝试在主线程中添加以下代码,也在线程类中添加。
QTime now = QTime::currentTime();
qsrand(now.msec());
现在的问题是,每次启动应用程序时,生成的值总是相同的。
它们不应该不同,因为种子是由'currentTime()'设置的。
由于
答案 0 :(得分:8)
我在线程/类构造函数中有我的qsrand()。当我将它移动到run()函数时,它开始随机工作。不知道为什么它不能从构造函数中工作。谢谢大家的帮助。
答案 1 :(得分:4)
这可能会帮助碰巧遇到类似问题的人:
qsrand(static_cast<quint64>(QTime::currentTime().msecsSinceStartOfDay()));
array<int, 5> arr = {qrand(), qrand(), qrand(), qrand(), qrand()};
for(auto i : arr)
cout << i << endl;
答案 2 :(得分:2)
我要检查的第一个是now.msec()
的值。它只返回当前时间的毫秒部分和doco状态:
请注意,准确性取决于底层操作系统的准确性;并非所有系统都能提供1毫秒的精度。
您的平台可能会始终为msec()
返回相同的值。如果是这种情况,您可以尝试以某种方式使用分钟和秒组合(假设您没有每秒多次运行代码)。
您尚未说明您正在运行哪个平台,但如果设置了Q_OS_WIN
或Q_OS_UNIX
,则Qt源代码仅支持亚秒级分辨率。
请记住,随机数是每个线程的,所以您应该在每个线程中执行qsrand
,以免它自动播种为1.
答案 3 :(得分:2)
我在线程/类构造函数中有我的qsrand()。当我将它移动到run()函数时,它开始随机工作。不知道为什么它不能从构造函数中工作。
qsrand()
使用线程本地存储来存储种子,该种子实际上是伪随机数生成器状态,在每次调用qrand()
时也会更新。如果您在将要使用它的线程之外播种PRNG,那么该种子不会影响结果。线程局部存储通常默认为零,这样每次都可以得到相同的伪序列,因为种子总是相同的。