[分享] 亂數產生器的好幫手 generate_n

看板C_and_CPP作者 (小乖)時間14年前 (2010/12/27 14:10), 編輯推噓3(307)
留言10則, 4人參與, 最新討論串1/1
有時候我們在寫測試程式時,需要產生一些亂數資料 eq.排序 最簡單的方式就是用迴圈 for(int i=0;i<N;i++) a[i] = rand_num_gen(); STL 提供了很簡潔的語法 (reference by Thinking in C++) generate_n(a,N,rand_num_gen); 以下是簡單的產生 1~100 之間的亂數到 a 陣列的範例程式: ========================================================== #include <ctime> #include <cstdlib> #include <cassert> #include <algorithm> #include <iterator> #include <iostream> using namespace std; class RandGen { int l_; int h_; public: RandGen(int l,int h): l_(l), h_(h){ assert(l_ < h_); srand((unsigned)time(0)); } int operator() (){ int range=(h_-l_)+1; return l_ + static_cast<int>(range*rand()/(RAND_MAX + 1.0)); } }; int main() { const int N = 20; int a[N]; generate_n(a,N,RandGen(1,100)); copy(a,a+N,ostream_iterator<int>(cout," ")); } -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 61.57.74.177

12/27 22:15, , 1F
我覺得 <random> 比較好用
12/27 22:15, 1F

12/27 23:07, , 2F
12/27 23:07, 2F

12/28 00:22, , 3F
哈 學到一個更讚的東西了 讚^^
12/28 00:22, 3F

12/28 07:28, , 4F
原po的第18行改成double在gcc 4.4下才會是輸出正確結果
12/28 07:28, 4F

12/28 07:32, , 5F
另外tr1/random裏面迴圈加遞迴,實測原po的速度較快,看用途囉
12/28 07:32, 5F

12/28 14:48, , 6F
l 跟 h 可以改成 template 參數,反正 run time 時不變
12/28 14:48, 6F

12/28 14:49, , 7F
變成 template<int, int>class RandGen{....};
12/28 14:49, 7F

12/28 14:50, , 8F
還有 member function 應該改成 const
12/28 14:50, 8F

12/28 14:52, , 9F
by value 傳遞也可以不用 const @_@
12/28 14:52, 9F

12/28 18:25, , 10F
謝謝D 大,我只有在 VC10 上測過 XD
12/28 18:25, 10F
文章代碼(AID): #1D69vGMB (C_and_CPP)