Qt qrand没有生成随机数

Qt qrand没有生成随机数,qt,random,Qt,Random,我有一个QT应用程序,运行两个以上的线程 在线程内部,我使用qrand函数生成一个随机数。下面是用于获取数字的代码,其中m_max是一个双精度数 int fluctuate = qrand() % (int)(m_FluctuationMax * 100); 我尝试在主线程中以及线程类中添加以下代码 QTime now = QTime::currentTime(); qsrand(now.msec()); 现在的问题是,每次启动应用程序时,生成的值总是相同的 它们不应该不同吗,因为种子是由

我有一个QT应用程序,运行两个以上的线程

在线程内部,我使用qrand函数生成一个随机数。下面是用于获取数字的代码,其中m_max是一个双精度数

int fluctuate =  qrand() % (int)(m_FluctuationMax * 100);
我尝试在主线程中以及线程类中添加以下代码

QTime now = QTime::currentTime();
qsrand(now.msec());
现在的问题是,每次启动应用程序时,生成的值总是相同的

它们不应该不同吗,因为种子是由“currentTime()设置的”

谢谢

我首先要检查的是
now.msec()的值。它只返回当前时间的毫秒部分和doco状态:

请注意,精度取决于底层操作系统的精度;并非所有系统都提供1毫秒的精度

可能是您的平台总是为
msec()
返回相同的值。如果是这样的话,您可以尝试以某种方式组合使用分和秒(假设您没有每秒多次运行代码)

您没有说明正在哪个平台上运行,但如果设置了
Q_OS_WIN
Q_OS_UNIX
,则Qt源代码仅支持亚秒分辨率


请记住,随机数是每个线程的,因此您可能应该在每个线程中执行
qsrand
,以免它自动以1作为种子。

我的qsrand()位于线程/类构造函数中。当我将它移动到run()函数时,它开始随机工作。不知道为什么它不能从构造函数中工作。谢谢大家的帮助

我的qsrand()位于线程/类构造函数中。当我将它移动到run()函数时,它开始随机工作。不知道为什么它不能从构造函数中工作


qrand()
使用线程本地存储来存储种子,种子实际上是伪随机数生成器状态,在每次调用
qrand()
时也会得到更新。如果您在将要使用PRNG的线程外对其进行种子设定,则该种子不会影响结果。线程本地存储通常默认为零,这样每次都可以获得相同的伪随机序列,因为种子总是相同的。

这可能会帮助碰巧遇到类似问题的任何人:

qsrand(static_cast<quint64>(QTime::currentTime().msecsSinceStartOfDay()));

array<int, 5> arr = {qrand(), qrand(), qrand(), qrand(), qrand()};

for(auto i : arr)
   cout << i << endl;
qsrand(static_cast(QTime::currentTime().msecsSinceStartOfDay());
数组arr={qrand(),qrand(),qrand(),qrand(),qrand(),qrand()};
用于(自动i:arr)

我可以检查一下吗?现在,毫秒的值每次都不一样,但随机数每次都一样。@Michael,每次调用
qrand()
时,数字都一样吗?或者每次程序运行时,序列都一样(每个
qrand()
调用的数字不同)?m_Max设置为什么?如果你总是得到相同的号码,那是什么?每次应用程序运行的顺序都是一样的。不过我找到了解决办法。检查下面的答案。仅供参考:它在构造函数中不起作用,因为
qsrand()
(每个线程的独立值)。将调用放入构造函数时,种子在一个线程中初始化,并在另一个线程中使用。将调用放入
run()
方法时,种子将在调用
qrand()
的同一线程中初始化。