2010-06-29 190 views
4

我有一个QT应用程序,运行2多个线程。qrand不生成随机数

线程内我使用qrand函数来生成一个随机数。以下是用于获取数字的代码,其中m_fluctuations max是double。

int fluctuate = qrand() % (int)(m_FluctuationMax * 100); 

我试着在主线程和线程类中添加下面的代码。

QTime now = QTime::currentTime(); 
qsrand(now.msec()); 

现在的问题是,每当应用程序启动时,生成的值总是相同的。

它们不应该不同,因为种子是由'currentTime()'设置的。

感谢

回答

8

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

+10

仅供参考:由于'qsrand()'[存储线程本地存储中的种子](http://doc.qt.nokia.com/latest/qtglobal.html#qsrand)(每个线程的独立值)。在调用构造函数时,种子将在一个线程中初始化并在另一个线程中使用。将调用放入'run()'方法时,种子将在调用'qrand()'的同一个线程中初始化。 – 2011-10-01 04:57:50

2

第一件事我会检查是now.msec()值。它只返回当前时间和多克状态的毫秒部分:

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

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

您尚未说明您正在运行的平台,但如果设置了Q_OS_WINQ_OS_UNIX,则Qt源代码仅支持亚秒级分辨率。


请记住,随机数是每个线程的,所以你可能应该做qsrand每个线程,以免它与1

+0

我现在检查和毫秒的值是不同以往的时间,但随机数是每次都一样。 – 2010-06-29 07:01:04

+0

@Michael,每当你调用'qrand()'或每个程序运行时的_sequence_都相同(每个'qrand()'调用有不同的数字)时,_number_是否相同? – paxdiablo 2010-06-29 07:04:47

+0

又是什么m_Fluctuation_Max设置?而且,如果你总是得到相同的号码,那是什么? – paxdiablo 2010-06-29 07:06:12

2

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

qsrand()使用线程本地存储来存储种子,实际上是还获得每次调用qrand()更新伪随机数发生器的状态。如果您将PRNG种在您将要使用它的线程之外,那么该种子不会影响结果。线程本地存储通常默认为零,这样每次都会得到相同的伪随机序列,因为种子总是相同的。

3

这可以帮助任何人谁碰巧有一个类似的问题:

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

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

for(auto i : arr) 
    cout << i << endl;