では、実際にプログラムを作ってみましょう。
まずは、実験をするので大元になるクラスExamクラスを作りました。 このクラスは試行回数n, 結果を格納する配列y, 結果を表示するshow関数を メンバとして持っています。// saikoro.cpp #include <iostream.h> #include <string.h> #include <stdlib.h> #include <time.h> class Exam { protected: int n, y[11]; void show(); public: Exam(); }; Exam::Exam() { memset(y, 0, sizeof(y)); cout << "試行回数は-->"; cin >> n; } void Exam::show() { int i; cout << n << "回の試行の結果" << endl; cout << "------------------------" << endl; for (i = 0; i <= 10; i++) cout << i + 2 << "\t:" << y[i] << "回" << endl; cout << "-------------------------" << endl; return; }
コンストラクタは配列を0で初期化して、ユーザーに実験の試行回数 を訪ねます。
show関数はy[0]からy[10]までの値を表示します。(2個のさいころの目の合計が 2の時はy[0]に1を加え、3の時はy[1]に1を加え、nの時はy[n-2]に1を加えておきます。)
さて、実験クラスExamはこれだけです。これだけではさいころが振れないので さいころクラスを作って(派生させて)さいころを振ります。
Examクラスからさいころクラスを派生させました。class Saikoro : public Exam { void furu(); public: Saikoro(); }; Saikoro::Saikoro() { time_t mytime; srand(time(&mytime)); furu(); show(); } void Saikoro::furu() { int i; for (i = 0; i < n; i++) { switch((rand() % 6 + 1) + (rand() % 6 + 1)) { case 2: y[0]++; break; case 3: y[1]++; break; case 4: y[2]++; break; case 5: y[3]++; break; case 6: y[4]++; break; case 7: y[5]++; break; case 8: y[6]++; break; case 9: y[7]++; break; case 10: y[8]++; break; case 11: y[9]++; break; case 12: y[10]++; break; default: cout << "異常です" << endl; break; } } return; }
Saikoroクラスのコンストラクタはsrandで乱数の種をまいています。 その後furu関数を呼んで、実際にさいころを振り、show関数で 結果を表示します。
furu関数では、rand関数を2回呼んで、2個のさいころを振ったときの シミュレーションをしています。結果を配列に格納していきます。 これをn回繰り返します。
さて、これでお膳立てはできました。あとはmain関数を作るだけです。
main関数はずいぶん簡単ですね。これだけ見るといったい何のプログラムなのか 想像もつきません。int main() { Saikoro MySaikoro; return 0; }
筆者はこのプログラムをVC++6.0で作りました。32ビット環境なので int型は32ビットです。従って試行回数は60万回などの大きな値を 入力できます。16ビットの人はint型をlongにするなどしてください。
60万回の試行で目の合計が7となったのは10万140回でした。
ほぼ6分の1の確率ですね。
Update Mar/12/2000 By Y.Kumei