今天正好debug到多執行緒產生隨機數,發現傳統的srand(time(null))已經不管用了(由於執行緒開始的時間可能相同,導致隨機數種子一樣),在網上查詢了一番。給出的方法無非兩種:
獲取更精確的時間單位(time(null)獲取的是秒為單位的時間),如毫秒ms,或者微秒us
使用執行緒id作為隨機數種子
經過測試發現:
隨機數種子宣告的位置會影響隨機數的結果,這裡的位置,主要是指執行緒內/外。具體見圖一,圖二
僅用執行緒id仍然無法避免產生相同隨機數的可能(原因我還沒想明白,不知道各位大佬有懂的沒),具體見圖二
附:隨機數種子生成部分的**
dword id = getcurrentthreadid();
large_integer nfreq, t1;
queryperformancefrequency(&nfreq);
queryperformancecounter(&t1);
double dt = (double)t1.quadpart / (double)nfreq.quadpart * 1000000;
srand(id+dt);
以上,歡迎大佬指正。 固定住深度模型訓練中的所有隨機種子
1.為了進行 復現,或者進行模型的改進,固定住隨機種子十分必要,不然所作的改進的提公升效果無從知曉,以下 可以確保每次訓練的過程一摸一樣 def seed torch seed 42 seed int seed random.seed seed os.environ pythonhashseed s...
C 中的並行與多執行緒程式設計
最近研究python有大牛越來越多了。本想嘗試一下的,不過語法結構很多不一樣。也沒有過多的精力來重新研究一門語言。還是把手上的c 精通一點更好。c 很簡單,適合我們這種小菜級別的玩。在處理很多資料的時候,加入c 新特性的並行和任務來實現多執行緒,超級有趣。先說2個小 乙個是task任務,相當於舊版的...
多執行緒中的併發,並行與序列的區別
你吃飯吃到一半,來了,你一直到吃完了以後才去接,這就說明你不支援併發也不支援並行。你吃飯吃到一半,來了,你停了下來接了 接完後繼續吃飯,這說明你支援併發。你吃飯吃到一半,來了,你一邊打 一邊吃飯,這說明你支援並行。併發的關鍵是你有處理多個任務的能力,不一定要同時。並行的關鍵是你有同時處理多個任務的能...