#!/usr/local/bin/perl
$N = 1000;
$f = 100/$N;
$sum = 0;
%sums = (0, 0, 0, 0);
($x1, $y1, $z1) = (0, 0, 1);
($x2, $y2, $z2) = (1, 1, 1);
%vectors = (
"0,0,0", [[1,0,0],[0,1,0],[0,0,1]],
"0,0,1", [[1,0,0],[0,1,0],[0,0,-1]],
"0,1,0", [[1,0,0],[0,-1,0],[0,0,1]],
"0,1,1", [[1,0,0],[0,-1,0],[0,0,-1]],
"1,0,0", [[-1,0,0],[0,1,0],[0,0,1]],
"1,0,1", [[-1,0,0],[0,1,0],[0,0,-1]],
"1,1,0", [[-1,0,0],[0,-1,0],[0,0,1]],
"1,1,1", [[-1,0,0],[0,-1,0],[0,0,-1]]);
MAIN: {
my $d;
for ($i=0; $i<$N; $i++) {
$d = abs($x1-$x2)+abs($y1-$y2)+abs($z1-$z2);
$sums[$d]++;
$sum += sqrt(($x1-$x2)**2 + ($y1-$y2)**2 + ($z1-$z2)**2);
($x1,$y1,$z1) = &get_next($x1,$y1,$z1);
($x2,$y2,$z2) = &get_next($x2,$y2,$z2);
}
printf("Average distance: %.2f\n", $sum/$N);
printf("(0: %.0f%) (1: %.0f%) (sqrt(2): %.0f%) (sqrt(3): %.0f%)\n",
$sums[0]*$f, $sums[1]*$f, $sums[2]*$f, $sums[3]*$f);
}
sub get_next() {
my ($x,$y,$z) = @_;
my ($dx,$dy,$dz);
my $index = int(rand(3));
my $key;
$key = sprintf("%d,%d,%d", $x, $y, $z);
$x += $vectors{$key}->[0][$index];
$y += $vectors{$key}->[1][$index];
$z += $vectors{$key}->[2][$index];
return($x,$y,$z);
}
|