2009 8/3

(本文とは無関係)

 全員で生還する確率を上げたければ、皆が何かしらの意味で協調した行動を取らなければならない。それなのに、挑戦中にも挑戦後に一切情報をやりとりできない。この一見取り付く島もなさそうなルールの裏をかくにはどうしたらいいか。

 情報をやりとりすることはできなくても、新しく全員が得ることができる情報がひとつだけある。というか、ひとつしかない。名前の書かれた紙である。突破口があるとしたらこれしかない。

 考えやすくするためにまず用語の準備をしよう。

 生徒には出席番号がついているものとして以後数字で考える。ついていなければどんな基準でもジャンケンでもくじ引きでもいいので適当に決める。以後生徒1〜42と呼ぶ。生徒nの名前の書かれた紙を紙nと呼ぶ。

 ロッカーにも番号を振る。たとえばロッカーに番号や記号がついていたら辞書順あるいは小さい順に、仮に番号がついてなかったとしても、左上が1でその右が2など事前に決めておいた何らかの規則性に基づいて、やはり1〜42と番号を振る。以後ロッカー1〜42と呼ぶ。

 さらに便宜的に同じ状態の42部屋で全員が同時に挑戦しているとして考え、生徒1が案内される部屋を教室1と呼ぶことにする。同様にして仮想の別々の教室をそれぞれ教室1〜42と呼ぶことにする。

 このゲームでは、生き残るために必要なのは自分の名前の紙だけである。仮に他人の名前の紙が入っていると分かっているロッカーがあるとしたら、そこを開けるのは避けるべきである。これが基本方針である。

 それを知る手段がないから困ってるんだろーが! と思ってしまいそうだが、もう少し待て。

 まず最初に開けるロッカーは全員別々にすると決めよう。あえて違う選択をする理由はないのでわかりやすさのため、生徒nはロッカーnを開けることにする。

 仮に自分が生徒13だとして、ロッカー13を開ける。もし幸運にも紙13が出てきたら、それでクリアだ。あとは他人の幸運を祈るのみである。しかし、そんなことは1/42の確率でしか起きないので、大抵は外れる。

 出てきたのが紙4だったとする。生徒13は「ああ外れた」と嘆き悲しむ。しかし、死にたくないので嘆いてばかりいないで2個目のロッカーを選ばなければならない。2個目はもう当てずっぽうで選ぶしかないだろうか? そんなことはない。

 実はこのとき、生徒13は、絶対に手に入らないと思われた他の部屋の情報を、知ることができている。

  • 教室4で生徒4が、紙4以外の紙を引き「ああ外れた」と嘆き悲しんでいるということ

 がわかるのだ。なぜなら、紙4はロッカー13に入っているのだから。ロッカー4を開けることになっている生徒4が紙4を引いたということは、ありえない。

 ということは、生徒13が次に選ぶべきは? ロッカー4である。なぜか? この時点で生徒13が何らかの情報を持っているのは教室4に関してのみである。たとえば教室7でロッカー7を開けた生徒7が紙7を引いている可能性は、僅かながらある。

 もちろん、生徒13が自分の生き残りだけ考えた場合、ロッカー4もロッカー7も「紙13が入っているかもしれない」ことにおいては何も変わることはない。

 しかし、全員で生き残りたいと考えている場合には、すでに他の生徒の正解と決定している(かもしれない)ロッカーを避けることには意味がある。

 よって生徒13は2個目にロッカー4を開ける。出てきたのが仮に紙9だったとする。このとき、生徒13には新たに2つのことがわかる。

  • 少し前、教室4で生徒4が1個目に開けたロッカー4から出たのは紙9だったこと
  • 現在、教室4で生徒4がロッカー9を開けて紙x(4,9以外の何か)を見ていること
  • 現在、教室9で生徒9はロッカーxを開けて紙yを見ているがyは9ではないこと

 最初の2つは当然として、紙yが紙9ではないというのはなぜわかるのか?

 紙yが紙9だとすると、紙9はロッカー4に入っているのだから、生徒9は2回目にロッカー4を開けたことになり、ひいては1回目に紙4の入ったロッカー13を開けたことになる。作戦上1回目にロッカー13を開けるのは生徒13である自分なのだから、生徒9が作戦に逆らったことになる。作戦に逆らう生徒はいないことになっているので矛盾である。よってyは9ではない。

 こうして2個目のロッカーを開けた時点で、生徒13は部屋を一歩も出ずして、生徒4と生徒9がいまだクリアしていないことがわかる。

 生徒13が3個目に開けるべきロッカーは? 先と同様の論理で9だ。なぜなら紙13が入っているかもしれない点では他と変わらず、かつ、すでに他の生徒の正解として確定してしまっている可能性がないロッカーだからだ。

 ここで、なんと! ロッカー9から紙13が出てきたとしよう。生徒13はもちろんクリアの喜びで雀躍する。だが、同時に生徒4と生徒9もクリアの喜びで雀躍していることがわかる。

 というのは、少し前、生徒4が開けたロッカー9に入っていた紙xが紙13だったというのなら、今現在、生徒4はロッカー13を開けて紙4を発見したところだからだ。生徒9に関しても同様。

 では、肝心のその作戦で全員生き残れる確率はいくらかぐらいになるのか? とりあえず10万回試行させてみたところ、なんと約32%もある。こんな怖ろしいゲームに巻き込まれて笑い話で済む可能性が1/3近くもあるなんて、約4兆4千億分の1とか言ってたのに比べると夢のような話ではないか。

 ただし、いくら同様に続けても紙13が発見できず、今だクリアしていないと分かっている生徒が増えていくだけの可能性もある。21個目のロッカーを開けても紙13が発見できなかった場合。生徒13は死ぬ。

 そして同時に、これまで紙の上に名前を見てきた4,9をはじめとする他の21人も同時に死ぬということがわかってしまう。なぜなら、すでに自分とその21人のクリアはかならず同時になることがわかっているからだ。自分が助かっていない以上みんな死ぬ。

 要するに、例の場合4,9,13の3つのロッカーが13→4→9→13というループを形成していたことになる。すべての番号は必ず1以上42以下の長さのループに所属することになる。ルール上そうならないことは不可能である。

 22以上の長さのループが存在しさえしなければ、全員が、確実にクリアできる。逆に22以上の長さのループが存在してしまうと、そのループにつかまった生徒は一人残らず死ぬ。

 ループの長さがいくつになるパターンがいくつあるかをちゃんと計算すれば厳密な確率も求まるはず……だが、その方法は自分も思い出せない*1ので発展課題にしておく。

*1:そもそもあったかも忘れた。

試行に使ったRubyスクリプト


#!/usr/local/bin/ruby
#-*- coding: Windows-31J -*-

TIMES = 10000
NUM = 42
max = NUM / 2

all = 0
win = 0

live_sum = 0
dead_sum = 0

TIMES.times do
  all += 1

  arr = (0...NUM).to_a
  arr = arr.sort_by{|i| rand}

  live = 0
  dead = 0

  (0...NUM).to_a.each do |i|
    cnt = 0
    box = i
    loop do
      cnt += 1
      if cnt > max
        dead += 1
        break
      end
      if arr[box] == i
        live += 1
        break
      else
        box = arr[box]
      end
    end
  end

  live_sum += live
  dead_sum += dead

  win += 1 if live == NUM
  puts "#{win}/#{all}回目の試行:#{live}人生存・#{dead}人死亡"
end

puts "個人が助かる確率:#{live_sum.to_f / (live_sum + dead_sum).to_f}"
puts "全員助かる確率:#{win.to_f / all.to_f}"

追記 8/5

 HandDrumさんのコメントを元に、厳密解の求め方をコードにしたもの。これでよさそう。


#!/usr/local/bin/ruby
#-*- coding: Windows-31J -*-

class Integer
  def factorial
    (1..self).inject(1){|r, i| r * i}
  end
  def permutation(n)
    self.factorial / (self - n).factorial
  end
end

NUM = 42
puts 1 - (0...(NUM/2)).inject(0) {|r, n| r + NUM.permutation(NUM - n) / (NUM - n) * n.factorial}.to_f / NUM.factorial

おまけ

 死にゲーつながり。選曲と天丼が秀逸。(釣り・微ビックリ注意)

by 木戸孝紀 tags: ブックマークに追加する

2006 10/7

 見た目も大きさも同じ8個の重りがあります。7個は重さも同じですが1つは他よりわずかに軽いニセモノです。天秤を使ってニセモノを確実に特定するには何回天秤を使う必要があるでしょうか。ただしこの天秤はただの天秤ではなく嘘つき天秤で、1回だけ嘘をつく(左に傾く・右に傾く・釣り合うの中から間違った結果を出す)可能性があります。

 まず私の解答を書きます。正解は4回です。4回で確実に特定する手順は以下の通り。

123
456
789

 重りを上のような3×3の行列風に並べます(9はダミー)。

 4回の各測定で、横・縦・右斜め・左斜めの列ごとに3個ずつをそれぞれグループとし、9が入っていない2グループを天秤に載せます。

 釣り合った場合は皿に載っている6個を、傾いたら上がった皿に載っている以外の6個に白判定回数を+1します。

 4回目が終わった時各重りの白判定回数が1以下のものが1つだけ残ります。それがニセモノです。

 次に3回以下ではできないことを示します。結果的にニセモノを特定できた時、同時に天秤が何回目にどんな嘘をついたか、あるいは嘘をつかなかったかも全て特定されます。

 天秤を3回使う時、天秤の嘘のつき方は1-3回目でそれぞれ2通りの嘘をつく、あるいは全くつかないの7通りがありえます。さらにニセの重りがどれかで8通りの場合があるので、問題全体の場合の数は 7 * 8 = 56 通りです。

 対して天秤から得られる情報は最高でも 3 ^ 3 = 27 通りしかありません。3回で確実にニセモノを特定できるということは、27通りの結果を見ただけで56通りの問題のどれかひとつを確実に言い当てられることを意味し、これは明らかに不合理です。

 よって3回では特定できません。

解説

 元となった有名な金貨8枚の問題(ビルゲイツの面接試験にももちろん載ってる)に適当に条件を付け加えてみたら意外にもすごく面白い問題に化けてしまいました。

 一見答え方も元の問題と同じに見えます。元の問題は2回で特定できます。それを応用すれば、各測定を2回繰り返し、嘘が出て割れた場合だけもう一回必要なので答えは5回……と言いたくなります。

 しかし! 正解は4回でした。4回でできる方法があったんです。面白いですね。最初は元の問題の先入観から「まず123と456番の重りを天秤に載せて、釣り合った場合……」という風にニセモノを特定する方向で考え始めたので、ややこしすぎてハマりました。

 で答えてもらったDanielさんの解答を見るとそれでできないわけではないですが。

 解法を見つけるには元の問題に立ち返って、そもそも天秤で何をしているのか、そして特定できたと言うためには最後にどのような状態になっていなければならないかをちゃんと原理から見直さないといけませんでした。

 まず天秤が釣り合うということは皿に載っている全ての重りが白だということです。天秤が傾くということは上がった方の皿に載っているもの以外の全ての重りが白だということです。

 そして3/3/2個に分けるのは、天秤の1回で3通りを識別できる特性を最大現生かすためです。

 そしてここからがポイントですが、今回の天秤が1回だけ嘘をつくかもしれない中で、ニセモノを特定できたと言える条件は他の7個の重り全てが2回以上白判定を受けていることです。

 2回以上白判定を受けていれば最低でもどちらかは真実、すなわちその重りは本物です。逆に言えばその条件を満たせなければ失敗です。

 条件を満たすには、もっとも運が悪い場合でも確実に白判定の数が0や1の重りを追いつめ、その数を減らすことができるようにグループ分けしなければなりません。

 それを可能にする方法は、ある時点でもっとも白判定回数の少ないものが最大限別々になるような3グループに分けて計り続ける方法です。ここまで来てようやく行列風のグループ分けに思いいたりました。

具体例

 ニセモノは3、2回目に嘘が出て釣り合うはずが左に傾く場合。ただし3*3の数字は、

123
456
789

 と同じ位置にある番号の重りの白判定回数。

1回目:123・456・789がグループ

000
111
111

2回目:147・258・369がグループ

101
212
212

3回目:159・267・348がグループ

211
223
313

4回目:168・249・357がグループ

321
324
324

結論:1回しか白判定されていない3がニセモノ。

 3回でできないことを示した方法はもっと一般的にできます。k回天秤を使い、重りがn個の時、


n(2k+1) > 3^k

 ならば特定不可能です。問題は n=8 k=4 だったので 72 <= 81 なので特定できたのは不思議ではありません。

 というか私が諦めずに4回でできる方法を探したのは先にこっちの式でできないと決まったわけではないとあたりをつけていたからです。

 また、この式から重りが9個でも、81 = 81 なのでできるかもしれないことが分かります。現に上の解答の手順でダミーを本物と区別しないだけでできます。

 天秤を3回しか使わない場合、できるのは3個までということも分かります。4個になると28 > 27 なのでできません。

 しかし、適当に考えた割には本当に面白い問題でした。付き合っていただいた方々ありがとうございます。

by 木戸孝紀 tags: ブックマークに追加する

2006 9/28

ビル・ゲイツの面接試験―富士山をどう動かしますか?

 ナメック星人9割・サイヤ人1割の住む惑星で殺人事件が起きました。唯一の目撃者は「犯人はサイヤ人だった」と証言しました。信頼すべき第三者機関が実験を繰り返した結果「目撃者が当日の条件下で犯人の人種を見間違える(つまりサイヤ人をナメック星人と見誤る、もしくはナメック星人をサイヤ人と見誤る)可能性は10%」という結果が出ました。この事件の真犯人がサイヤ人である確率は?

 答えはずばり50%である。えー!? そんなバカな! 目撃者は90%正しく判断できるんだから90%に決まってるじゃん。と思うかもしれない。

 だがそれは「真犯人がサイヤ人だったときに目撃者がサイヤ人と証言する確率」であって、いま問題になっている「目撃者がサイヤ人と証言したとき真犯人がサイヤ人である確率」とは必ずしも同じとは限らない。それどころが全然異なる。

真犯人(下)証言(右) ナメック星人 サイヤ人 合計
ナメック星人 81 9 90
サイヤ人 1 9 10
合計 82 18 100

 惑星全土で同時に100件の殺人事件が起きていて、その全てに1人ずつ目撃者がいたと考えよう。そのうち90件がナメック星人の犯行で10件がサイヤ人の犯行である。

 90件のナメック星人の犯行のうち81件が正しくナメック星人の犯行と証言され、9件は間違ってサイヤ人の犯行と証言される。10件のサイヤ人の犯行のうち9件が正しくサイヤ人の犯行と証言され、1件は間違ってナメック星人の犯行と証言される。

 問題とされている事件は、目撃者がサイヤ人の犯行であると証言した18件の事件のうちの1つである。そのうち本当にサイヤ人の犯行であるのは9件であるから、求める確率は9/18。つまり50%である。

 面白いのは問題中の誰1人として偏見を持って行動している人はいないにも関わらずサイヤ人は少数派であるというだけでかなりの割合で無実の疑いをかけられてしまうということだ。答えを90%だと思ったまま捜査すれば冤罪を生んでしまいそうな結論である。

 現実でも同じようなことは起こりうる。たとえば100万人に1人の不治の奇病があったとする。検査の精度は99.9999%だとしよう。この検査に引っかかって「陽性です」と言われたら確実に死んでしまうと思ってショックを受けるだろう。

 だが、実はまだ本当に病気である確率は半分しかない。本当にその病気にかかっている100万人に1人の人間なのか、0.0001%の検査のエラーに当たってしまった人間なのかは、再検査するまで何とも言えないからだ。

by 木戸孝紀 tags: ブックマークに追加する

2006 8/18

階段の問題

 先日の問題の答え合わせです。未読の方は先にそちらのエントリを読んで考えてから読むことをおすすめします。

 棒人間君が図のような魔の7段階段の5段目にいます。棒人間君は毎回コインを投げて、表が出れば上に一段登り、裏が出れば下に一段下がります。7段目にたどり着けばクリア、生きて帰れます。逆に1段目まで降りてしまったらゲームオーバー、死にます。

 さて、この棒人間君が生還できる確率は? もちろんコインの裏表は1/2の確率で等しく出るものとし、階段の途中でやめることはできないものとします。

 さすがネットは広大ですね。3日も経たないうちに解答が出尽くしました。まずもっとも普通に正攻法で解こうとすると、

 となるでしょう。これはもちろん完全に正しくて、正解が出せます。しかしパズルとしてはよりエレガントな解法を見つけたくなると思います。

 問題を読んですぐ一歩引いて「4段目からスタートだったら超簡単なのになあ」と思えた人はセンスがあると思います。

 4段目は階段の中央なので、ルールの対称性より4段目からの生還確率は1/2以外ではありえません。それに気づけば5段目からの生還確率は3段目からの死亡確率に等しいといったことも同時に気がつくでしょう。

 舞台を数直線でなく階段にしたり、棒人間の生死とか大げさな設定をつけたり、一番下を0段目でなく1段目と数えて中央の段を偶数である4にしたりしているのはその対称性から目をそらす策略でもあったわけです。

 時間の対称性にも着目しましょう。時間に応じてルールが変わるわけではないので、コインを振って移動した後も、そこから生還できる確率は最初からそこにいた場合と同じなのです。

 これに気づけば時間tを使った式を立てる必要はなさそうだという予感がしてきます。ここから先の解法はいくつかあるでしょうが、私がもっともエレガントで甲乙つけがたいと思っているのは以下の2通りです。

 この問題の醍醐味をフル活用するとただの連立方程式に。5段目の解を求めるためにあえて一歩引いて他の段からの生存確率を広く考えることでかえって楽に解けてしまうところが素晴らしい。

 コイン2回をセットで考えてたまたまそれでうまくいく段数と初期配置だからこその解法というところが、前者に比べて技巧的な印象ではあります。

 しかし、正攻法だとあれほど複雑に見えた問題が、求める確率をそのままxと置いた中学生レベルの方程式1つで解けてしまうというのはある意味感涙モノではないでしょうか。

by 木戸孝紀 tags: ブックマークに追加する