ゲーマーじゃんけんのシミュレーション

竹内郁雄先生のアイコ問題についての反応から:

「確率による調整。アイコが多いならゲーマーじゃんけんでも良いと思う。」ゲーマーじゃんけん」 by id:kamataro

ゲーマーじゃんけんは面白い。ジャンケン1回ごとに人数が28%くらいに減っていく。

「先生対生徒全員で手を挙げて一斉にジャンケンをして負けた生徒は抜けていく…じゃだめなのか」by id:kyorecoba

これは1回ごとに1/3に減る。ゲーマーじゃんけんには少し劣るし、勝負に参加しない「先生」が必要。

「人数が多いときはパーとグーだけ使って(チョキ出した人は失格)多い(少ない)勝ちとかしないのか!?まあそれでも参加者が偶数の時はあいこが発生しちゃうけど…。」 id:aratafuji

少ないものがちじゃんけんは1回ごとに人数が50%くらいに減っていく。50%未満じゃないかと思うかも知れないが、同数になったときにやり直しなのが平均を上に引っ張ってしまうので50%を少し超えそう。多いものがちじゃんけん…なぜ少ないもの勝ちにしないのか謎だが、一応計算すると60%くらいだ。今まで出た中で最悪だ。

上で上げた方法は、全部参加者の人数Nが増えるに従ってlog(N)のオーダーでジャンケン回数が増える。1000人でスタートすると、少ないものがちじゃんけんでは平均およそ10.0回、ゲーマーじゃんけんではおよそ5.4回で勝者が決まる。で、前回のエントリーで僕が解説した方法では、およそ1.0000(ここの0のカタマリは全部で238個くらい)00001回で勝者が決まる。そして目下のところ「1回で勝負が決まる方法があるかもしれない」という紀先生の案の検証待ちの状態。

なお、上記の「28%くらい」という値は60人スタートで100万回のシミュレーションをして決定した。以下ソースコード:

from random import choice

NUM_TRIAL = 1000000
NUM_PEOPLE = 60
HANDS = [0, 1, 2]

sum = 0
for _trial in range(NUM_TRIAL):
    hands = [choice(HANDS) for _i in range(NUM_PEOPLE)]
    counts = [hands.count(hand) for hand in HANDS]
    counts.sort()
    num_winner = counts[0]
    if counts[-1] == num_winner:
        num_winner = NUM_PEOPLE
    sum += num_winner

print float(sum) / NUM_TRIAL / NUM_PEOPLE