主要是通过 蒙特卡罗法来计算圆周率。代码如下:
1) pi.pl:
$time1 = time();
foreach (1..20000000) {
my($x, $y) = (rand(), rand());
if(sqrt($x ** 2 + $y ** 2) < 1) {
$total += 1;
}
}
$pi = 4.0 * $total / 20000000;
$time2 = time();
print "Pi = " , $pi, " time = ", $time2 - $time1;
Perl脚本运行结果如下,2千万次平均执行时间是27秒左右:
2)pi.py
import random
import datetime
import math
starttime = datetime.datetime.now()
total = 0
for i in xrange(20000000):
x, y = random.random(), random.random()
if math.sqrt(x ** 2 + y ** 2) < 1:
total += 1
pi = 4.0 * total / 20000000
endtime = datetime.datetime.now()
print "pi = ", pi , " time = ", (endtime - starttime).seconds
Python运行结果如下,2千万次平均执行时间是30秒左右:
3) pi.erl
-module(pi).
-export([pi/1]).
pi(N) ->
pi(N, N, 0).
pi(N, 0, Total) -> 4.0 * Total / N;
pi(N, I, Total) ->
X = random:uniform(),
Y = random:uniform(),
R = math:sqrt(X * X + Y * Y),
if
R < 1 -> pi(N, I - 1, Total + 1);
true -> pi(N, I - 1, Total)
end.
Erlang运行如下,2千万次平均执行时间是30秒左右:
4) pi.c
#include
#include
#include
#include
int main() {
time_t start_time, end_time;
double elapsed_time;
double x, y, pi;
long i , total;
total = 0;
srand((unsigned)time(0));
time(&start_time);
for(i = 0 ; i < 20000000; i ++ ) {
x = rand() / (double)(RAND_MAX);
y = rand() / (double)(RAND_MAX);
if (sqrt(x * x + y * y) < 1) {
total += 1;
}
}
pi = 4.0 * total / 20000000;
time(&end_time);
elapsed_time = difftime(end_time, start_time);
printf(" total = %d, pi = %f, time = %f", total ,pi, elapsed_time);
}
C运行如下,
2千万次平均执行时间是3秒左右:
Python, Erlang 速度相当, Perl稍微快一丁点, C语言是它们的10倍。