[問題] 想請教function的問題

看板C_and_CPP作者 (殺手)時間14年前 (2012/02/01 17:52), 編輯推噓0(0024)
留言24則, 4人參與, 最新討論串1/2 (看更多)
抱歉~ 又來請教function的問題 (使用C++) 要做一個普瓦松的隨機數據 已在網路上找到一個樣本 但我想把這個程式做成一個function 因為我最主要的程式 會一直使用這個反覆產生隨機數值 但是在main()前面 一堆class 一堆function 搞得頭都昏了 試了很多次 還是沒辦法 (實在是太肉腳) 只好來請教各位高手~ 程式碼網址 : http://ideone.com/XkMQH =========================== 以下是程式碼 #include <iostream> #include <iomanip> #include <cstdlib> #include <ctime> #include <cmath> #include<fstream> #include<iomanip> using namespace std; // simulation de v.a.r. uniforme sur ]0,1[ : inline double unif_rand() { return (rand() + 0.5)/(RAND_MAX + 1.0); } class Alea { public: virtual double rand() const = 0; }; class AleaDiscret : public Alea { public: virtual double loi(int n) const = 0; virtual double rand() const; }; double AleaDiscret::rand() const { double y = unif_rand(); int x = 0; double Fx = loi(0); while ( y > Fx ) { Fx += loi(++x); } return double(x); } class Poisson : public AleaDiscret { double lambda; double e_lbda; public : Poisson(double l = 1.0) : lambda(l) , e_lbda(exp(-l)) {} virtual double loi(int n) const { return e_lbda*pow(lambda,n)/tgamma(n+1); } // plus rapide que AleaDiscret::rand() virtual double rand() const; }; double Poisson::rand() const { double x = 1; int n = -1; do { x *= unif_rand(); ++n; } while ( x > e_lbda ); return double(n); } double moy(const Alea & a) { const int N = 1000; double s = 0.0; for (int n = 0 ; n < N ; ++n) s += a.rand(); return s/N; } int main(){ double total=0; double duration[100]; //這個100的數值可修改 int tmp=0, num; Poisson poi(12); //這個12的數值可修改 srand(int(time(0))); do{ duration[tmp]=poi.rand(); total+=duration[tmp]; tmp++; }while(total<=50); //這個50的數值可修改 for(int i=1; i<tmp; i++){ duration[i]+=duration[i-1]; } cout<<tmp<<endl; for(int i=0; i<tmp; i++){ cout<<duration[i]<<endl; } return 0; } 實在是做不出來 只好來請教 謝謝您~~ -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.116.243.66 ※ 編輯: ieck 來自: 140.116.243.66 (02/01 17:55) ※ 編輯: ieck 來自: 140.116.243.66 (02/01 17:58)

02/01 18:07, , 1F
02/01 18:07, 1F

02/01 18:10, , 2F
http://ppt.cc/5jtU random在c++11有增加新標準能用
02/01 18:10, 2F

02/01 18:10, , 3F
直接拿來用不用自己寫
02/01 18:10, 3F

02/01 18:32, , 4F
j大 您也太厲害了吧 ><" 可以指導一下 如何找出關鍵的key?
02/01 18:32, 4F

02/01 18:35, , 5F
d大 謝謝您~ 對於新手的我 看來要多花點時間消化 ><"
02/01 18:35, 5F

02/01 19:12, , 6F
http://ppt.cc/4i8L 較清楚的介紹
02/01 19:12, 6F

02/01 19:33, , 7F
d大 謝謝您~~ ^^
02/01 19:33, 7F

02/01 19:45, , 8F
j大 我想問說您寫的 第13行到第67行 可以跟foo()包在一起
02/01 19:45, 8F

02/01 19:46, , 9F
包在一起 變成一個function嗎? 這樣擺到別的程式中 上面這些
02/01 19:46, 9F

02/01 19:46, , 10F
第13行到第67行 就不用看起來這麼多~!
02/01 19:46, 10F

02/01 19:48, , 11F
寫成標頭 include 不就看不到了XD
02/01 19:48, 11F

02/01 19:50, , 12F
拆掉行數不一定會比較少阿= =
02/01 19:50, 12F

02/01 19:56, , 13F
對不起........ ><" 請原諒我這個門外漢 問 蠢~問~題
02/01 19:56, 13F

02/01 19:57, , 14F
W大 我試了 OK了 謝謝您的指點 ><"
02/01 19:57, 14F

02/01 19:58, , 15F
這是程式架構的問題,當然也可以全部寫在main內
02/01 19:58, 15F

02/01 19:58, , 16F
但是在程式的維護上就很差
02/01 19:58, 16F

02/01 19:59, , 17F
原po可以花點時間在oo上面下功夫,相信會有很多心得
02/01 19:59, 17F

02/01 19:59, , 18F
所以有些人會建議將程式重複的地方拆成副程式
02/01 19:59, 18F

02/01 20:00, , 19F
有些時候行數不代表程式比較精簡,有些為了要將程式
02/01 20:00, 19F

02/01 20:01, , 20F
的可用性提高,以及封裝的過程會花了很多的行數
02/01 20:01, 20F

02/01 20:01, , 21F
但帶來的益處是更多的
02/01 20:01, 21F

02/01 20:11, , 22F
看前面的 include 想必原 po 自己有對程式做一些刪減
02/01 20:11, 22F

02/01 20:12, , 23F
卻忘了刪掉 include. ex: #include<fstream>
02/01 20:12, 23F

02/01 20:29, , 24F
W大 對阿~ 原本是要輸出在文字檔 為了發問方便就寫成cout
02/01 20:29, 24F
文章代碼(AID): #1FAGjESn (C_and_CPP)
文章代碼(AID): #1FAGjESn (C_and_CPP)