[ 0137: 0133 ふたたび ]
[ 丘品花志先生の出題の復習 ]
図に示すように 1 辺の長さが 1 の立方体の上面の対角頂点に 2 匹の虫がいます。
これらは同時に 3 方向 (隣の頂点のいずれか) に動き続けるものとします。
移動途中は無視して、2 匹が頂点にいる状態での平均距離を長時間にわたって求めると
どういう値になるでしょうか?
[ 浅見多絵さんの回答 ]
前回の回答は間違っていましたので、
湯会老人にアドバイスをいただきながら再度挑戦しました。
同一平面上の対角頂点に 2 匹がいる状態からスタートしますと、
縦横上下にしか動けないチェス盤の世界みたいなものですから:
■ 距離 1 の状態 (隣の頂点同士) はありえません。
■ 距離 sqrt(3) の状態もありえません。
初期状態 (距離 sqrt(2)) からの次の一手では
距離 0 (同一頂点) になる場合と位置は違えど
距離 sqrt(2) を維持する状態がありますが、
距離 sqrt(2) の確率のほうが 3 倍になります。
距離 0 になりますと、次の一手では距離 sqrt(2) にしかなりません。
上記から、距離 sqrt(2) の状態のほうが多いことがわかりますが、
確率計算を頭でやると混乱しますので乱数を使ったシミュレーションで
統計をとってみました。結果は以下のとおりです。
Average distance: 1.0603
(0: 25.03%) (1: 0.00%) (sqrt(2): 74.97%) (sqrt(3): 0.00%)
距離 0 と距離 sqrt(2) の出現頻度の比は
1:3 でした。
これを式であらわしますと:
平均距離 = (1*0 + 3*sqrt(2))/(1 + 3) =
1.06066...
Perl スクリプトのソースコードは以下のとおりです。
#!/usr/local/bin/perl
$N = 1000000; # 試行回数。
$sum0 = 0;
$sum1 = 0;
$sum2 = 0;
$sum3 = 0;
$sum = 0;
# 初期状態。
$x1 = 0;
$y1 = 0;
$z1 = 1;
$x2 = 1;
$y2 = 1;
$z2 = 1;
MAIN: {
my $d;
for ($i=0; $i<$N; $i++) {
$d = abs($x1-$x2)+abs($y1-$y2)+abs($z1-$z2);
if ($d == 0) {$sum0++}
elsif ($d == 1) {$sum1++}
elsif ($d == 2) {$sum2++}
else {$sum3++}
$sum +=
sqrt(($x1-$x2)**2+($y1-$y2)**2+($z1-$z2)**2);
# 2匹の次の位置を求める。
($x1,$y1,$z1) = &get_next($x1,$y1,$z1);
($x2,$y2,$z2) = &get_next($x2,$y2,$z2);
}
printf("Average distance: %.4f\n", $sum/$N);
printf(
"(0: %.2f%) (1: %.2f%) (sqrt(2): %.2f%) (sqrt(3): %.2f%)\n",
100*$sum0/$N, 100*$sum1/$N, 100*$sum2/$N, 100*$sum3/$N);
}
sub get_next() {
my ($x,$y,$z) = @_;
my $choice;
my $ran = rand(1);
if ($ran < 1/3) {
$choice = 1;
} elsif ($ran < 2/3) {
$choice = 2;
} else {
$choice = 3;
}
if ($x == 0) {
if ($y == 0) {
if ($z == 0) {
if ($choice == 1) {$x+=1}
elsif ($choice == 2) {$y+=1}
else {$z+=1}
} else {
if ($choice == 1) {$x+=1}
elsif ($choice == 2) {$y+=1}
else {$z+=-1}
}
} else {
if ($z == 0) {
if ($choice == 1) {$x+=1}
elsif ($choice == 2) {$y+=-1}
else {$z+=1}
} else {
if ($choice == 1) {$x+=1}
elsif ($choice == 2) {$y+=-1}
else {$z+=-1}
}
}
} else {
if ($y == 0) {
if ($z == 0) {
if ($choice == 1) {$x+=-1}
elsif ($choice == 2) {$y+=1}
else {$z+=1}
} else {
if ($choice == 1) {$x+=-1}
elsif ($choice == 2) {$y+=1}
else {$z+=-1}
}
} else {
if ($z == 0) {
if ($choice == 1) {$x+=-1}
elsif ($choice == 2) {$y+=-1}
else {$z+=1}
} else {
if ($choice == 1) {$x+=-1}
elsif ($choice == 2) {$y+=-1}
else {$z+=-1}
}
}
}
return($x,$y,$z);
}
|
|