教你如何用C++快速生成1000萬個隨機數
阿新 • • 發佈:2019-02-08
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)
請直接看程式碼,所有重要資訊均在上面。
- /*
- 本程式實現的功能:
- 生成1000萬個可能重複的隨機數,用作測試資料
- 並計算生成這些資料所用的時間
- */
- #include <iostream>
- #include <ctime> // time.h也可,用於計算程式執行時間和生成隨機種子數
- usingnamespace std;
- #define SELF_RAND_MAX 0x7FFFFFFF
- int main()
- {
- //typedef long clock_t
- clock_t start_time = clock();//計時開始
- srand(unsigned(time(0)));//生成時間種子
- //生成的數值在1000到1000萬之間
- constint MAX = 10000000;
- constint MIN = 1000;
- /*讀入資料 freopen("in.txt","r",stdin);
- //寫入資料 freopen("out.txt","w",stdout);
- //fclose(stdin);//關閉檔案
- //fclose(stdout);//關閉檔案
- 把標準輸入流stdin重定向到in.txt檔案中,
- 這樣在用scanf或是用cin輸入時便不會從標準輸入流讀取資料,
- 而是從in.txt檔案中獲取輸入。
- 只要把輸入資料事先貼上到in.txt,除錯時就方便多了。
- */
- freopen("data.txt","w",stdout);
- //cout << "---Generate 10,000,000 random numbers\
- // which maybe repeated---" << endl;
- for(int i = 0; i < 10000000; ++i){
- //#define RAND_MAX 0x7FFF
- //較標準unsigned long data = ( MAX * rand() )/ ( RAND_MAX + MIN)+ 1;
- //unsigned long data = (MAX - MIN + 1 ) * rand() + MIN;
- //unsigned long data = ((MAX - MIN + 1 ) * rand() + MIN) % 10000000;
- unsigned long data = rand() % (MAX - MIN + 1) + MIN;//較標準
- cout << data << ' '; //輸出資料到data.txt
- }
- fclose(stdout);
- freopen("time.txt","w",stdout);
- cout << endl
- << "---the end---"
- << endl;
- //CLOCKS_PER_SEC控制精度,在windows環境下是1000,linux下是多少完了
- //簡單地說windows下是毫秒級,而linux下是納秒級
- cout << "elapsed time:" << double(clock() - start_time) / CLOCKS_PER_SEC
- << 's' << endl;
- // fclose(stdout);
- }
time.txt中
---the end---
elapsed time:5.171s
生成的data.txt有55M之多。共有1000萬個資料,通過下面的測試程式可以斷定,這1000萬個資料的值均在1000-10000000之間。
- #include <iostream>
- #include <ctime>
- //#include <boost/timer.hpp>
- //using namespace boost;
- usingnamespace std;
- int main(){
- unsigned long data;
- //timer t;
- int len = 0;
- freopen("data.txt","r",stdin);
- while(cin >> data){
- if(data >= 1000 && data <=10000000)
- {
- //cout << data << endl;
- len++;
- }
- }
- cout << len << endl;
- // cout << t.elapsed() << endl;
- }
執行結果為10000000
另外如何生成不重複的1000萬個數?這是個非常大的挑戰,待日後解決。
好吧,繼續投入Top K的學習。