本文へスキップ
モンテカルロシミュレーション
モンテカルロ・シミュレーションのオンライン教科書 C言語版

 このホームページは、乱数をたくさん発生させ、確率実験を行なう手法――これをモンテカルロ・シミュレーションといいます――のオンライン教科書です。こちらC言語版ですJavaアプレット版こちら

確率論  統計学 オペレーションズリサーチ  待ち行列理論 トラヒック理論 雑音解析  ディジタル信号処理などに興味のある方、コンピュータ上で確率実験を行いながら理解を深めることができます。


経緯

1994年に、著者はソフトバンク社から「Cによるシミュレーションプログラミング」 という本を、出版しました。

  • 単行本: 286ページ
  • 出版社: ソフトバンク株式会社
  • ISBN-10: 4890525491
  • ISBN-13: 978-4890525492
  • 発売日: 1994/07
  • 著者: 石川 宏

 現在それは絶版となっています。しかしながら、その後、それを大学などの教科書に使いたい、再版しないのかなどの問い合わせが いまだにあります。  そのため2009年にホームページ上から、直接 プログラムを実行出来るように、CプログラムをJavaアプレットに変換し、オンライン化したところです。
 しかしながら、最近セキュリティの問題からJavaアプレットが使えないブラウザが増加し、Javaアプレットは主流ではなくなってきたようです。そのためあらためてC言語のままで公開することにしました。C言語は普遍的です。(Javaアプレット版はこちらに残してあります)

 このホームページの各章の解説にソースプログラムを表示するほか、66本のソースプログラムを一括してこちらからダウンロードできます。

 1994年当時のパソコンはまだWindowsのない16ビットのMS-DOSの時代で、使用した開発環境はPC-98、ボーランド社のTurboCでした。最近そのTurboCがWindows7、10上でそのまま動かすことができる、フリーソフトTurboC++ for Windowsを見つけましたので、それを用いることとします。

 また、Raspberry Piは小さいながらUNIXマシンであり、当時SUNワークステーション用に作っていたバージョンが動かないか試してみました。問題なく快適に開発・実行ができましたので、報告します。



Step1  TurboC++ for Windowsをダウンロード
Step2  zipファイルTurbo.C.3.2.zipを展開
Step3  setup.exeを実行 TURBOC3フォルダは、c:ドライブ直下に置きました。
Step4  当サイトから、Cによるシミュレーションプログラムをダウンロード、展開
Step5  展開したファイルをsimulationフォルダごとC:\TURBOC3の下にすべてコピー
Step6  そのなかのcompti.hwindow.hINCLUDEフォルダにコピー

 これでCによるシミュレーションプログラムがコンパイル、実行できます。ただし制約事項があります。16ビット版のTurboCを64ビット版Windows上で動かすため、「MS-DOS環境」を再現するエミュレータ「DOSBox」を用いています。DOSBoxが日本語をサポートしていないので、日本語メッセージが化けます。またキーボードがUS101 キーボードを前提としているので、特殊文字のキイトップがあいません。したがって、ソースプログラムの編集はWindows上のエディタ(私は秀丸)を用い、コンパイルと実行をTurboCで行うこととします。DOSBoxの日本語化のサイトもあるようですが、トライしていません。


私のデスクトップ(1280X1024)の例。右上がTurboC++ for Windows。秀丸エディタと比べると、日本語のコメントが正しく表示されていない。秀丸でソースを編集・保存し、TurboC++ for Windowsでコンパイル・実行する。


実行結果はTurboC++ for Windowsのユーザスクリーン(640X480)上に表示される。ユーザスクリーンへの切り替えはショートカットで。

TurboC++ for Windowsのよく使うショートカットは次のとおり
F1 ヘルプ
F2 ファイル保存
F3 ファイル開く
Alt+F9 コンパイル
Ctrl+F9 実行
Alt+X TurboC終了
Alt+Enter フルスクリーンへ切り替え
Alt+F5 ユーザスクリーンへ切り替え
Ctrl+F10 マウスをDOSBox内とWindowsで切り替え


 Raspberry Piをセンサーとして動かすことは何度もやってきましたが、今回プログラム開発のUNIXマシンとして動かしました。意外とストレスなく、20年前に作ったシミュレーションプログラムがそのまま動かせました。ただしC言語の仕様がセキュリティー対策のためか、いくつか変更になっていましたので、修正(のとおり)してあります。こちらからシミュレーションプログラムの最新版をダウンロードしてください。

1.RsuberryPiとしては、最も高速なクアッドコアCPUのPi3モデルB(標準的)をつかう
2.OSとしてはDebian系Linuxの「Raspbian通常版」を使いました。海外サーバーはダウンロードが遅いので日本ミラーからダウンロードする
http://ftp.jaist.ac.jp/pub/raspberrypi/raspbian/images/
3.フォーマットしたSDにWin32DiskImagerで書き込む
4.IPアドレスを固定する。
5.Windows側からファイル共用するためSambaをインストールする。プログラムの編集はWindows上の秀丸で行っています。
6.XWindowのX11ライブラリをインストールする
$ sudo apt-get install xorg-dev
7.当方のサイトから、Cによるシミュレーションプログラムをダウンロード、展開
8.ホームディレクトリの下の
$ ~/simiulation
に展開したプログラムをすべてコピーする
9.コンパイルはつぎのとおり
$ cd simulation
$ gcc S0510.C -o test -lm -lX11
-lmmath.h 、-lX11は X Window Systemライブラリを指定
10.実行は
$ ./test
下はRaspberryPIで5章のビュフォンの針を実行したときのスクリーンです。実行速度は並みのパソコンより速いくらいです。





/*  古い仕様  */
 void main(void){

}

/*  新しい仕様  */
int main(void){
  return 0;
}

このほかキーボードからgets()での読み込みはやめました。



 1. モンテカルロ法とシミュレーション
 2. 乱数はシュミレーションの基本−− 乱数の発生方法−−
2.1 でたらめな数の列−−乱数−−
2.2 Javaの乱数発生機構 −−rand()関数−−
2.3 乱数は本当の乱数か−−頻度の検定−−
2.4 もう1つの乱数検定方法−−ポーカ検定−−
演習
 3. 乱数を用いた確率の実験
3.1 コインを投げる実験−−二項分布−−
3.2 ごくまれにしか起こらないこと−−ポアソン分布−−
3.3 ごくまれにしか起こらないことの時間間隔−−指数分布−−
3.4 大数の法則−−何回も繰り返す−−
3.5 中心極限定理−−たくさんのサイコロを投げる−−
演習
 4. どんな分布の乱数でも作り出せる−−乱数の変換方法−−
4.1 区間を決めた一様分布の乱数を作る−−区間一様乱数−−
4.2 指数分布の乱数を作る−−指数乱数−−
4.3 ポアソン分布の乱数発生方法−−ポアソン乱数−−
4.4 アーラン乱数を作る −アーラン乱数−
4.5 正規分布の乱数を作る −正規乱数−
4.6 任意の分布の乱数を作る
演習
 5. 乱数を用いた実験数学−−モンテカルロ法−−
5.1 モンテカルロ法の古典−−ビュフォンの針−−
5.2 乱数によりπを求めるもう1つの例−−モンテカルロ法による数値積分−−
5.3 乱数により球の体積を求める−−モンテカルロ法による多重積分−−
演習
 6. ランダムウォークのシミュレーション
6.1 1次元ランダムウォーク
6.2 2次元ランダムウォークのシミュレーション
6.3 拡散のシミュレーション
6.4 ほこりはすみにたまる
演習
 7. 信号処理−−雑音の中から信号を拾い出す−−
7.1 ショットノイズのシミュレーション
7.2 CRフィルタによる信号の分離
7.3 移動平均による信号の分離
7.4 同期加算
演習
 8. 同時進行のシミュレーション技法−−機械修理の問題を例題に−−
8.1 机上で実験してみる
8.2 コンピュータによる例題のシミュレーション−−固定時間方式−−
8.3 高速な方法−−変化点方式−−
8.4 どちらのシミュレーション方式がいいか
8.5 シミュレーション時間の決め方
演習
 9. 通信トラヒックのシミュレーション−−待ち合わせシステムと即時系システム−−
9.1 待ち合わせシステムの種類
9.2 待時式入線無限大のシステム↑*−−待ち合わせシステムの標準−−
9.3 待ち合わせのないシステム−−即時系システム−−
9.4 プライオリティ待ち合わせシステム−−至急と普通−−
9.5 サービス段が複数の場合−−いくつものサービスを受ける−−
9.6 無線でパケット伝送−−ALOHAシステム−−
9.7 データ伝送の標準方式−−ポーリング・システム−−
演習
10. 何でもシミュレーションしょう−−ギャンブルからジェネティックアルゴリズムまで−−
10.1 ギャンブル必勝法
10.2 在庫管理問題
10.3 欠番
10.4 強磁性体の相転移のシミュレーション
10.5 ジェネティック・アルゴリズム
演習
付録 簡易マルチウインドウシステム
参考文献