多線程中生成隨機數序列重復問題的解決方法


多線程中需要生產隨機數,以供測試使用,但是生產隨機數需要用一些數據作為種子,經過查資料常見的方法是用簡單的時間信息作為種子數據進行生產隨機數,這種方法在普通的情況下,單線程生產隨機數有着很大的用處,但是在多線程的環境下,這種情況就會變得不適用了,因為在多線程的情況下,多個線程是同時進行使用的,而最簡單去的取Time的信息僅僅取得是秒。現在又是Intel I系列的時代,也就是說一秒內可以產生很多進程。如果在這個時候去取的話,一秒內所得的進程的隨機數基本都是一致的,因此在這種情況下,最簡單的這種取隨機數的函數就會變得不再適用。

也就是這個變得不太實用:

srand((unsigned)time(NULL)); 

 

 進而在網絡上搜索到一系列的方法,下面是選取精確時間作為隨機數種子的代碼:

LARGE_INTEGER nFrequency;
    if(::QueryPerformanceFrequency(&nFrequency))
    {
        LARGE_INTEGER nStartCounter;
        ::QueryPerformanceCounter(&nStartCounter);
        ::srand((unsigned)nStartCounter.LowPart);
    }
    else
    {
        

        struct timeb stb;//需要添加頭文件#include<sys/timeb.h>
        ::ftime(&stb);
        ::srand((unsigned)stb.millitm);
    }

此代碼的來源在於:http://blog.csdn.net/ishallwin/article/details/4593500

但是發現在這個過程中,兩個線程如果同時打開的話,所產生的隨機數還是一致的,但是相比之前的簡單的產生隨機數的函數,這個產生的效果好了很多,但是沒有進一步往下測試的原因就是不知道,這個程序這樣添加了以后,會不會占用系統更多的資源。

同時附上的是ftime()函數的詳解與使用:

  //相關函數:time, ctime, gettimeofday
  //表頭文件:#include <sys/timeb.h>
  //函數定義:int ftime(struct timeb *tp);
  //函數說明:ftime()將目前日期由tp所指的結構返回。
  //tp結構定義:
  
/*struct timeb{   time_t time; /* 為1970-01-01至今的秒數*/   unsigned short millitm; /* 千分之一秒即毫秒 */   short timezonel; /* 為目前時區和Greenwich相差的時間,單位為分鍾 */   short dstflag; /* 為日光節約時間的修正狀態,如果為非0代表啟用日光節約時間修正 */   };*/
  返回值 :無論成功或失敗都返回0   范例:   #include
<sys/timeb.h>   main()   {   struct timeb tp;   ftime(&tp);   printf("%d\n", tp.time);   }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM