1. 程式人生 > >教你如何用C++快速生成1000萬個隨機數

教你如何用C++快速生成1000萬個隨機數

updated: 2012.5.10

上個星期天(2012.5.6)中午去華科參加了百度的筆試,試卷的最後一題是問百度搜索框的suggestion提示功能如何實現,用什麼資料結構和演算法。

我簡單地提及了一下Top K。

前段時間看過演算法大牛JULY部落格中的一些面試題,其中有講到Top K演算法。且《程式設計之美》中也有一節專門講解Top K。現如今百度也考到了,說明Top K演算法真的是太重要了。可惜之前都只是粗淺地看了一遍,沒有徹底領悟。現在正在著手於Top K的學習,程式碼寫好了需要海量測試資料,上哪找呢?哼哼,當然是自己寫程式生成啦。下面將介紹一種方法來隨機生成1000萬個隨機數,並將資料儲存到檔案data.txt中,方便我們隨時進行測試。

精華部分:

srand(unsigned(time(0));//隨機種子,為了提高不重複的概率
   rand()%(MAX-MIN + 1) + MIN;                //生成的隨機數值在MIN和MAX之間(包含MIN,MAX)

請直接看程式碼,所有重要資訊均在上面。

  1. /* 
  2. 本程式實現的功能: 
  3. 生成1000萬個可能重複的隨機數,用作測試資料  
  4. 並計算生成這些資料所用的時間  
  5. */
  6. #include <iostream>
  7. #include <ctime> // time.h也可,用於計算程式執行時間和生成隨機種子數 
  8. usingnamespace std;  
  9. #define SELF_RAND_MAX 0x7FFFFFFF
  10. int main()  
  11. {  
  12.  //typedef long clock_t 
  13.  clock_t start_time = clock();//計時開始
  14.     srand(unsigned(time(0)));//生成時間種子
  15.  //生成的數值在1000到1000萬之間 
  16.     constint MAX = 10000000;  
  17.     constint MIN = 1000;  
  18.     /*讀入資料 freopen("in.txt","r",stdin);  
  19.  //寫入資料 freopen("out.txt","w",stdout); 
  20.  //fclose(stdin);//關閉檔案  
  21.     //fclose(stdout);//關閉檔案  
  22.     把標準輸入流stdin重定向到in.txt檔案中,
     
  23.  這樣在用scanf或是用cin輸入時便不會從標準輸入流讀取資料, 
  24.  而是從in.txt檔案中獲取輸入。 
  25.  只要把輸入資料事先貼上到in.txt,除錯時就方便多了。  
  26.     */
  27.   freopen("data.txt","w",stdout);  
  28.   //cout << "---Generate 10,000,000 random numbers\
  29.   //         which maybe repeated---" << endl;
  30.  for(int i = 0; i < 10000000; ++i){  
  31.   //#define RAND_MAX 0x7FFF
  32.     //較標準unsigned long data = ( MAX * rand() )/ ( RAND_MAX + MIN)+ 1;
  33.     //unsigned long data = (MAX - MIN + 1 ) * rand() + MIN;
  34.    //unsigned long data = ((MAX - MIN + 1 ) * rand()   + MIN) % 10000000;
  35.    unsigned long data = rand() % (MAX - MIN + 1) + MIN;//較標準 
  36.     cout << data << ' '//輸出資料到data.txt 
  37.  }  
  38.  fclose(stdout);  
  39.  freopen("time.txt","w",stdout);  
  40.  cout << endl   
  41.       << "---the end---"
  42.    << endl;  
  43.    //CLOCKS_PER_SEC控制精度,在windows環境下是1000,linux下是多少完了
  44.    //簡單地說windows下是毫秒級,而linux下是納秒級 
  45.     cout << "elapsed time:" << double(clock() - start_time) / CLOCKS_PER_SEC  
  46.          << 's' << endl;  
  47.   //  fclose(stdout);
  48. }  
執行結果:

time.txt中

---the end---

elapsed time:5.171s

生成的data.txt有55M之多。共有1000萬個資料,通過下面的測試程式可以斷定,這1000萬個資料的值均在1000-10000000之間。

  1. #include <iostream>
  2. #include <ctime>
  3. //#include <boost/timer.hpp>
  4. //using namespace boost;
  5. usingnamespace std;  
  6. int main(){  
  7.     unsigned long data;  
  8.     //timer t;
  9.     int len = 0;  
  10.     freopen("data.txt","r",stdin);  
  11.     while(cin >> data){  
  12.       if(data >= 1000 && data <=10000000)  
  13.       {  
  14.         //cout << data << endl;
  15.      len++;   
  16.       }  
  17.     }  
  18.     cout << len << endl;  
  19.      // cout << t.elapsed() << endl;
  20. }  


執行結果為10000000

另外如何生成不重複的1000萬個數?這是個非常大的挑戰,待日後解決。

好吧,繼續投入Top K的學習。