森川です。
モンテカルロ法でπの計算を行うブログを見つけたので、それに触発されてそのスクリプトをPythonとRubyで書いてみました。
PHP
<?php
$iteration = 100000;
$precision= 1000000;
for ($i = 0; $i < $iteration; $i++) {
$x = mt_rand( 0, 2 * $precision ) / $precision - 1;
$y = mt_rand( 0, 2 * $precision ) / $precision - 1;
if ((($x * $x) + ($y * $y)) < 1 ) {
$hits++;
}
}
Python
from random import *
iteration = 100000
i = 0
hits = 0
seed()
while i < iteration:
i = i + 1
x = random()
y = random()
if (((x * x) + (y * y)) < 1) :
hits = hits + 1
print "PI is about", (float)(4 * hits) / (float)(iteration), "<br>\n"
Ruby
iteration = 100000
i = 0
hits = 0
while i < iteration
i = i + 1
x = rand()
y = rand()
if (((x * x) + (y * y)) < 1) :
hits = hits + 1
end
end
print "PI is about", (4*hits).quo(iteration) , "<br>\n"
このスクリプト自体は全然難しくないので、すぐにPythonでもRubyでも書くことができましたが、そんな中でもPHPの良さを再発見することができました。
それは、マニュアルの見やすさです。
PHPのマニュアルは説明の中に出てくる関数にリンクが貼られていて、すぐその内容を調べることができます。また、関数の説明にサンプルがかなりの確率で付いているので、すごくスクリプトを書きやすいです。
それと、比較してみるとわかるのが、キャストの柔軟性です。特に変数に型がないので、割り算の結果を少数にするのが一番簡単です。
ただ、Pythonの書き方が非常に簡単で個人的には好きです。Rubyはオブジェクト指向な部分がこのスクリプトでも quo などに表れていますが、PHPに慣れていると少しとまどってしまいます。まぁJavaScriptと同じと考えると割とすんなり入っていけるかなぁとも思いますが。
さらに、PHPの実行スピードは意外と速い。以下は実行時間を計ってみた場合のログですが、PHPが一番速く、続いてPython、Rubyは for if や変数の代入などの処理が大きいようです。
#time php monte.php
PI is about3.14408<br>
real 0m0.221s
user 0m0.214s
sys 0m0.008s
#time python monte.py
PI is about 3.14396 <br>
real 0m0.262s
user 0m0.255s
sys 0m0.006s
#time ruby monte.rb
PI is about3.14556<br>
real 0m0.400s
user 0m0.395s
sys 0m0.005s
意外とPHPは遅いと思われているかもしれないけれど、計算や繰り返し処理単体では決して遅くはありません!!!