自然対数の底を求める

さて、リクエストがあったので自然対数の底を求めました。
自分の知識が正しければ、モンテカルロ法という確率的な推定方法だと思います。

アルゴリズムは、まとさんのをほとんどそのまま。
再掲載。
 ① まず0〜1の乱数を発生させる
 ② もう一度乱数を出し、最初の数に足す
 ③ ①②を繰り返し、1を超えた時点での足した個数を出力
 ④ ①〜③を繰り返し、平均を出す
ただし、意図せず足す個数が大きくなるのを防ぐため、100を上限とした。
まあ、100までいくことは確率的にもほとんどありえないことだが。
あと、平均を出すところは、個数を全部足しておいてから、
データ数で割るというふうにしました。
結局は「乱数発生回数/データ数」と一緒です。
乱数は[0,1]の閉区間
乱数の生成にはBorlandC++5.5のrand()関数を、種数は1です。

では結果です。実際の数値は小数点以下10桁までで
2.7182818284
です。(まとさんが書いていたのはちょっと違ってたみたいです)

データ数推定値
103.0000000000
1002.7900000000
10002.7440000000
100002.7240000000
1000002.7218400000
10000002.7175480000
100000002.7182661000
1000000002.7182501600

なんか想像よりうまくいってる。
これ以上はもうほとんど収束しないんじゃないかな。
実際、データ数1千万から1億のときに推定値が遠のいてるし。

また、推定値がどう推移しているかグラフにしました。
横軸は対数スケールです。



100〜1000あたり、変なところで振動してるけど、
その後、何とか持ち直してる。
でも一回ずれると戻るのに時間がかかるみたいだ。
1000万からはこのスケールでは変化なしですね。

円周率もモンテカルロ法で確率的に求める方法がありますが、
それは今後、機会があれば。
多分、検索かければいくらか出てくると思います。