2010-06-29 144 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;