見出し画像

小説「ゲームの王国」に登場するゲーム「人生 」について

[画像出典: https://www.takaratomy.co.jp/products/jinsei/]

「ゲームの王国」

「ゲームの王国」という小説を読みました。
カンボジアを舞台にしたSF小説というユニークな設定に加え、カンボジアの生活感や虐殺の歴史のリアリティ、キャラクターの多彩さが魅力的でとても面白かったです。
またこの小説の主人公の1人である天才少年ムイタックはゲームやルールに関してこだわりを持っており、小説内の随所で人間社会のゲーム性とそこにあるべきルールについて言及します。彼の考え方もまた面白い点でした。

そんなムイタックは物語の後半で脳科学の教授となり、学生リアスメイに「人生」という名の数字ゲームを持ちかけます。この小説がめちゃくちゃ面白かったこともさることながら、こんなタイトルの小説に"人生"などというゲームが登場すると、作者がこのゲームに何らかのメッセージを込めている気がしてならず、どうにもその意図が気になってしまい少し考えてしまいました。総括すると「人生は下り坂と捉えた方が上手くいく」だと私は捉えたのですが、以下にその考えに至る過程を示します。

小説内のゲーム、「人生」のルール

ゲーム、「人生」のルールはいたって簡単で、以下のようなものです。

1. 参加者Aは19枚の紙に思いついた数字を書き連ねる(この時対戦相手である参加者Bには数字を見せない)。
2. 参加者Bは1枚ずつめくる。なるべく大きな数字が出たと思った段階で「運命」と宣言しストップをかける。 そうでない場合は「抵抗」と宣言し次の紙をめくる。
3. AとBが交代で1,2を行い、運命をかけた数字の19枚の中での順位が大きい方の勝利。

とにかく大きい数字が来た!と思ったらストップをかければいい訳ですね。
紙に書く数字は実数であればなんでも良いようです。これがなぜ人生を模したゲームかといえば、以下のムイタックのセリフ[2]が分かりやすいでしょう。

「これから君は、誰かを愛するだろう。もしかしたら、今も誰かを深く愛しているかもしれない。でも君は、君の人生において、誰かひとりを選ばなければいけないんだ。目の前の相手は、はたして『運命』だろうか。この後の人生で、より運命的な出会いをするだろうか。決断は一度しかできない」

以下ではこのゲームをいかにしてプレイするとより高いスコアが狙えるかを小説に沿って考えていきます。

戦略0: 最初の数字を必ず運命とする

小説内で学生リアスメイはカードをめくりつつ攻略法を思案します。もっとも簡単には、何も考えずに必ず最初の数字を運命として受け入れるというものが挙げられました。カードの出目に一切規則性がない場合、この戦略で期待される順位がちょうど真ん中であることは直感的にわかると思います。19枚の数字があれば、期待順位は10です。これをベースラインとして考えていきましょう。

戦略1: k番目の数字より大きな数字が出たら運命とする

次の戦略は1枚目のカードをめくって覚えておき、それより大きな数字が出たらそれを運命とするものでした。
1枚目の期待順位が真ん中なら、それより良いものに限定すれば確かに真ん中より良い数字が得られそうです。これを実験してみます。

「19枚」のカードを「N枚」に一般化し、「1番目」のカードを覚えておく、というのを「k番目」のカードを覚えておく、のように一般化します。
カードに書かれている数字には独立な一様分布を仮定します。 

@numba.jit(nopython=True)
def play_life_strategy1(N, k):
    cards = np.random.uniform(0, 1, size=N)
    if k == 0:
        # 最初のカードで決め打ち
        select_num = cards[0]
    else:
        # k番目のカードを基準に, それより良い数字が出たらexit
        _k = k - 1
        base_line = cards[_k]
        select_num = cards[-1]  # 大きな数字が出なければ最後の数字を強制される
        for i in range(_k+1, N):
            if base_line < cards[i]:
                select_num = cards[i]
                break
    score = (cards <= select_num).sum() / N
    return score

横軸にk/N、縦軸に3000試行のスコアの期待値(0<・<=1. 大きいほど良い)をプロットするとグラフのようになります。

画像1


素晴らしい、何も考えずに1枚目を選ぶ場合の期待順位0.5よりも大きくなっています。
この結果は先にも述べた通りわりかし解釈しやすいと思います。
ざっくりとですが、1枚目のカードで決め打ちすると期待順位は0.5で、それより大きい場合に取り出すと、0.5~1.0の間の一様分布の期待値なので0.75になるといったところでしょうか。また、基準となるカードを決めるのを遅らせすぎると、残りのカードでそれより良い数字が出る確率が下がっていくためだんだんと期待順位が下がっていってしまうようです。最後まで待っていたら、ランダムに1枚選ぶ期待値と同じになってしまいます。
また、Nを大きくしていくと、基準となるカードを選ぶのが遅れても余命に余裕があるのでスコアは0.75近傍で安定していることも分かります。
この戦略で生きていく人は、余命が短い場合には特に、早めに自分の運命を決めてしまった方が良いようですね。

戦略2: k番目までの最大値より大きな数字が出たら運命とする

さらに2番目、3番目まで覚えておいて、それらの最大値を基準にしたら...?とリアスメイは考えました。人間の頭で考えるには場合分けが多杉...とリアスメイは諦めてしまいましたが、ここでも実験で確かめます。

@numba.jit(nopython=True)
def play_life_strategy2(N, k):
    cards = np.random.uniform(0, 1, size=N)
    if k == 0:
        # 最初のカードで決め打ち
        select_num = cards[0]
    else:
        # k番目までのカードの最大値を基準に, それより良い数字が出たらexit
        base_line = cards[:k].max()
        select_num = cards[-1]  # 大きな数字が出なければ最後の数字を強制される
        for i in range(k, N):
            if base_line < cards[i]:
                select_num = cards[i]
                break
    score = (cards <= select_num).sum() / N
    return score

画像2


なんとさらにスコアが上がりました。N=19枚の時の期待順位の最大値は0.85くらいのようです、強い。k→0やk→Nの際に0.5に落ち着くのは先ほどと同じ理由だと思われます。しかし今回はkの最適値らしきものがあるのがまた面白いですね。しかも枚数Nを大きくしていくとスコアのピークは1に近づいていきます。
リアスメイが直感でたどり着いた回答はもはや人生の必勝法にすら見えます。幸運にも若かりし頃のピークを上回ったら即人生Exitが最強説を醸してますが、なんだか世知辛い結果です。人生は下り坂だと思った方が上手くいくようですね。

出目の期待値の考察

この戦略が強すぎるので学部初等の確率統計を思い返してもう少し考えてみます。具体的にはこの戦略によって選ばれる値の期待値を導出します。
まずi番目のカードの出目をそれぞれXiとして、先ほどまでのようにN枚それぞれが独立な一様分布に従うと仮定します。

スクリーンショット 2020-12-26 14.35.44

・k番目までの出目に関して
戦略2は「k番目までの最大値」よりも大きな数を引いたらそいつに決める、というものでした。
まずはk番目までの最大値をY1で定義し、これの密度関数を求めましょう。

スクリーンショット 2020-12-26 14.36.40

こいつの分布関数をF_Y1とすると、これはk番目まで全てy以下、という条件で求められます。

スクリーンショット 2020-12-26 14.38.55

よってY1の密度は

スクリーンショット 2020-12-26 14.40.22

です。これで、基準となる値の密度が得られました。

k番目以降の出目に関して
k番目以降は基準値よりも大きな数字が出たらそこでストップとなります。仮にk+n番目でストップする場合には、k+n-1番目までは常に[0, y]の値が、k+n番目には[y, 1]の値が出ることになります。k+n番目の値が出目をxとすると、これがゲームのスコアになります。上で求めた密度関数を使い、最終スコアの期待値E[score]を計算してみます。nが1からN-kまでの値をとることと、最後までy以上の値を引けなかった場合を忘れないように注意すると、

スクリーンショット 2020-12-26 14.42.52

となります。

画像8

N=19の際の値を数値実験と理論値の間で比較してみると上記のようになります。なんかちょっとズレてるのは計算ミスなのか考え違いなのか気になりますが、しかし大体あってるのでこれでよしとしましょう。さっきのscoreの期待値を改めてs(N,k)と定義します。

スクリーンショット 2020-12-26 14.45.01

グラフからもわかりますが、

スクリーンショット 2020-12-26 14.45.48

の境界条件をしっかり満たしています。また、N枚でゲームをした時に期待スコアを最大にするkの値(つまり見切りをつける最良のタイミング)を

画像11

とすると、k*の値そのものや、Nが大きくなるにつれてk*/Nがどんな速さで0に近づいていくかの漸近挙動などは気になるところです。しかし手計算は辛いのでもう辞めます。代わりにそれぞれのNでs(N,k)を最大にするkを数値的に求め、これをフィッティングですることで大体の結果を求めました。

画像12

フィッティングで求めた黄色の曲線は

画像13

でした。大体

画像14

ぽそうです。寿命が長くなっていくにつれて、1/3乗の速さで見切りをつけるタイミングを早めた方が良いみたいですね。ちなみにNの単位を年として捉えてN = 80[歳]を代入するとk* = 16[歳]です。辛い、しかし示唆的な数字。

感想

ゲームとして

上記の戦略0~2ではカードの出目が独立な一様分布としましたが、故意に相手が数列に規則性を持たせていたり、カードに相関があって独立性が仮定できない場合などには上記の結果は成り立ちません。ここに人それぞれの戦略の違いが現れてきそうで、ゲームの醍醐味になるのかもしれません。
また、仮定が成立する場合にも上記の戦略よりもさらに強い戦略があるかもしれません。もし見つけたら是非教えてください。

人生として

これを1つの人生として考えると、また違った視点があり得ます。この小説の中でも特に自分が好きな一節として、ゲームを終えたリアスメイとムイタックのセリフ[2]があります。

「負けました。でも大事なことが分かりました」
「このゲームが人生に似ているという点です。真理を手にするためには、敗北を受け入れないといけません

もし答えが知りたければ、十九枚すべての紙をめくるまで、抵抗し続けなればいけない。そして、いざ答えを知ってしまえば、すでにその答えが自分の手の届かないところにあるのだと知り、真理という光とともに、深い絶望に沈まなければならない

「私のことです。捨ててしまった九十一について、今でも後悔しています。でも、全ての数字を見なければ、その後悔すら存在しませんでした

上記で考えたように戦略的に手仕舞いすれば確かにスコアの上昇が期待できますが、最初の数枚の時点ですでに自分の人生の行く末に見切りをつけなくてはなりません。人によってはスコアが高い方が"良い人生"とは限らず、どんな出目が出るか知ることに重きを置くのなら、自分のこの先の人生の出目を見続ける(期待し続ける)ために「抵抗」を続けるのもまた戦略の1つと言えるかもしれません。

しかし楽しむこと(出目を知ること)に重きを置いて勝負を放棄することは、単にゲーム(=高いスコアを目指して勝負する)の前提をひっくり返しているに過ぎないことには注意が必要かと思います。勿論人生をゲームとして捉えないのであれば全然OKなのですが。

楽しむことと勝利を目指すことを同時に達成できるような(人生)ゲームを作るには、一体どんなルールを敷けばいいのでしょうか。続きは小説で...

まとめ

(1) 人生をランダムな札めくりゲームとして捉える場合、もしくは人生という名のランダムな札めくりゲームをプレイする場合、人生は下り坂だと捉えた方が上手くいく
(2) この事実を受け入れたくない場合、ゲームを降りるか他の攻略法を見つけるしかない


参考
[1] https://www.amazon.co.jp/ゲームの王国-上-小川-哲/dp/4152096799
[2] https://www.amazon.co.jp/ゲームの王国-下-小川-哲/dp/4152097019
[3] https://www.takaratomy.co.jp/products/jinsei/ 

著者の小川哲のまわし者のようですが、「魔術師」という短編がkindleで無料で読めます。興味を持たれた方はぜひ読んでみてください。
https://www.amazon.co.jp/嘘と正典より「魔術師」無料配信版-小川-哲-ebook/dp/B07XT84LH8

この記事が参加している募集

おうち時間を工夫で楽しく

買ってよかったもの