自然対数の底を求める
さて、リクエストがあったので自然対数の底を求めました。
自分の知識が正しければ、モンテカルロ法という確率的な推定方法だと思います。
アルゴリズムは、まとさんのをほとんどそのまま。
再掲載。
まあ、100までいくことは確率的にもほとんどありえないことだが。
あと、平均を出すところは、個数を全部足しておいてから、
データ数で割るというふうにしました。
結局は「乱数発生回数/データ数」と一緒です。
乱数は[0,1]の閉区間。
乱数の生成にはBorlandC++5.5のrand()関数を、種数は1です。
では結果です。実際の数値は小数点以下10桁までで
2.7182818284
です。(まとさんが書いていたのはちょっと違ってたみたいです)
なんか想像よりうまくいってる。
これ以上はもうほとんど収束しないんじゃないかな。
実際、データ数1千万から1億のときに推定値が遠のいてるし。
また、推定値がどう推移しているかグラフにしました。
横軸は対数スケールです。
100〜1000あたり、変なところで振動してるけど、
その後、何とか持ち直してる。
でも一回ずれると戻るのに時間がかかるみたいだ。
1000万からはこのスケールでは変化なしですね。
円周率もモンテカルロ法で確率的に求める方法がありますが、
それは今後、機会があれば。
多分、検索かければいくらか出てくると思います。
自分の知識が正しければ、モンテカルロ法という確率的な推定方法だと思います。
アルゴリズムは、まとさんのをほとんどそのまま。
再掲載。
① まず0〜1の乱数を発生させる ② もう一度乱数を出し、最初の数に足す ③ ①②を繰り返し、1を超えた時点での足した個数を出力 ④ ①〜③を繰り返し、平均を出すただし、意図せず足す個数が大きくなるのを防ぐため、100を上限とした。
まあ、100までいくことは確率的にもほとんどありえないことだが。
あと、平均を出すところは、個数を全部足しておいてから、
データ数で割るというふうにしました。
結局は「乱数発生回数/データ数」と一緒です。
乱数は[0,1]の閉区間。
乱数の生成にはBorlandC++5.5のrand()関数を、種数は1です。
では結果です。実際の数値は小数点以下10桁までで
2.7182818284
です。(まとさんが書いていたのはちょっと違ってたみたいです)
データ数 | 推定値 |
10 | 3.0000000000 |
100 | 2.7900000000 |
1000 | 2.7440000000 |
10000 | 2.7240000000 |
100000 | 2.7218400000 |
1000000 | 2.7175480000 |
10000000 | 2.7182661000 |
100000000 | 2.7182501600 |
なんか想像よりうまくいってる。
これ以上はもうほとんど収束しないんじゃないかな。
実際、データ数1千万から1億のときに推定値が遠のいてるし。
また、推定値がどう推移しているかグラフにしました。
横軸は対数スケールです。
100〜1000あたり、変なところで振動してるけど、
その後、何とか持ち直してる。
でも一回ずれると戻るのに時間がかかるみたいだ。
1000万からはこのスケールでは変化なしですね。
円周率もモンテカルロ法で確率的に求める方法がありますが、
それは今後、機会があれば。
多分、検索かければいくらか出てくると思います。