作者spider391 (小乖)
看板C_and_CPP
標題[分享] 亂數產生器的好幫手 generate_n
時間Mon Dec 27 22:10:21 2010
有時候我們在寫測試程式時,需要產生一些亂數資料 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
→ loveme00835:我覺得 <random> 比較好用 12/27 22:15
→ spider391:哈 學到一個更讚的東西了 讚^^ 12/28 00:22
推 DirkC:原po的第18行改成double在gcc 4.4下才會是輸出正確結果 12/28 07:28
推 DirkC:另外tr1/random裏面迴圈加遞迴,實測原po的速度較快,看用途囉 12/28 07:32
推 avhacker:l 跟 h 可以改成 template 參數,反正 run time 時不變 12/28 14:48
→ avhacker:變成 template<int, int>class RandGen{....}; 12/28 14:49
→ avhacker:還有 member function 應該改成 const 12/28 14:50
→ loveme00835:by value 傳遞也可以不用 const @_@ 12/28 14:52
→ spider391:謝謝D 大,我只有在 VC10 上測過 XD 12/28 18:25