第32章 さいころの実験


今回は、2個のさいころを振ったときの目の合計が どのように出るかをコンピュータでシミュレーションするプログラムを 考えてみます。2個のさいころを振った時、目の合計は2から12までの いずれかになります。2個のさいころの目の出方の組み合わせは36通り有ります。 7になる組み合わせが最も多く6通り有ります。従って合計が7になる確率は 6分の1となります。



では、実際にプログラムを作ってみましょう。

// 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; }

まずは、実験をするので大元になるクラスExamクラスを作りました。 このクラスは試行回数n, 結果を格納する配列y, 結果を表示するshow関数を メンバとして持っています。

コンストラクタは配列を0で初期化して、ユーザーに実験の試行回数 を訪ねます。

show関数はy[0]からy[10]までの値を表示します。(2個のさいころの目の合計が 2の時はy[0]に1を加え、3の時はy[1]に1を加え、nの時はy[n-2]に1を加えておきます。)

さて、実験クラス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; }

Examクラスからさいころクラスを派生させました。

Saikoroクラスのコンストラクタはsrandで乱数の種をまいています。 その後furu関数を呼んで、実際にさいころを振り、show関数で 結果を表示します。

furu関数では、rand関数を2回呼んで、2個のさいころを振ったときの シミュレーションをしています。結果を配列に格納していきます。 これをn回繰り返します。

さて、これでお膳立てはできました。あとはmain関数を作るだけです。

int main() { Saikoro MySaikoro; return 0; }

main関数はずいぶん簡単ですね。これだけ見るといったい何のプログラムなのか 想像もつきません。

筆者はこのプログラムをVC++6.0で作りました。32ビット環境なので int型は32ビットです。従って試行回数は60万回などの大きな値を 入力できます。16ビットの人はint型をlongにするなどしてください。

60万回の試行で目の合計が7となったのは10万140回でした。 ほぼ6分の1の確率ですね。


[C++Index] [総合Index] [Previous Chapter] [Next Chapter]

Update Mar/12/2000 By Y.Kumei
当ホーム・ページの一部または全部を無断で複写、複製、 転載あるいはコンピュータ等のファイルに保存することを禁じます。