確率2%のくじ引きで100万人が当たりを引くまでチャレンジするシミュレーション

だいたい2%くらいの確率でドロップするっぽいGraf Zeppelinのドロップ。けれど実感としては2%なんて嘘だろう? そんなことを思ってしまうくらい苦しんでいるプレイヤーの姿が目について、いくらなんでもしぼりすぎだ、などなど、巷に怨嗟の声がこだましています。

さて、先日書いた確率2%のくじ引きをシミュレートするというスクリプト。今回はそれを少し書き直して、100万人が当たりを引くまで試行するようにしてみました。だいたい総試行回数は5千万回くらいになるようです。

前回、意外や1回目の試行で入手するケースが多い、だなんて驚いていましたが、これは別に不思議でも意外でもない当たり前のことで、2%で当たりが出るくじ引き。1回目のくじ引きで、100万の2%である2万人が当たりを引く。2回目は100万から2万を引くところの、98万の2%、19万6千人が当たりを引く、といった具合に、徐々に減っていくのが当たり前。実際、この記事の末尾に実行結果を載せていますが、それもほぼそのようになっていて、人間の感覚と理屈の乖離というものを実感させられます。

以前、ドロップする確率を入力すると、だいたいどれくらいの回数で、どれくらいの入手見込みがあるかを計算するスクリプトを書いたことがありました。

それによると2%のくじ引きだとこんな結果が出ます。

20% 12
50% 35
80% 80
90% 114
95% 149
98% 194
99% 228
99.999% 570

この目安と今回の実行結果、それを比較してみると、入手したプレイヤーの割り合いが2割を超えるのは、確かに12回試行した時で、50%は35回試行、80%も90%も計算のとおりに出ます。95%は148回試行と1回の差が生じて、99%は229回と今度は1回多くなってしまって、と、このあたりは本当に小さな誤差ですけれど、おそらくは試行回数をもっともっと増やしていくと、計算によって想定される回数にもっともっと近付いていくのでしょう。

さて、今回の結果だけをもって書いてしまいますが、ほぼ5千万回試行。49,915,914回ですが、場合によっては5千万を超えることもあります。これを入手者数100万人で割ると49.9回。ということは、50回くらいで入手するのが平均、標準、普通ってところなのかなと思ったところで、いや、これ、平均じゃなくて中央値を出さないといかんのじゃないか?

とまあ、そう思ったところで、計算する気はないんですけどね。

データはCSVで出力してるので、表計算ソフトに放り込んで計算させたら一発というのは理解してますが、今回はそれをする手間を惜しんでおこうと思います。

# -*- coding: utf-8-unix; mode: python -*-
import random

result = dict()
clg = 0
acquirer = 0

while acquirer < 1000000:
    cnt = 0
    havenot = True
    while havenot:
        cnt += 1
        clg += 1
        if random.randrange(50) == 1:
            if cnt in result:
                result[cnt] += 1
            else:
                result[cnt] = 1
            acquirer += 1
            havenot = False

total = 0
for key in range(max(result.keys()) + 1):
    if key in result:
        total += result[key]
        line = '{0:>5}, {1:>5}, {2:.4%}, {3:>7}, {4:.4%}'
        print(line.format(key,
                          result[key],
                          result[key] / acquirer,
                          total,
                          total / acquirer))
    elif key == 0:
        pass
    else:
        print('{0:>5},     0, 0%     ,        , 0%'.format(key))
print()
print('acquirer: {0:,}'.format(acquirer))
print('number of trials: {0:,}'.format(clg))
続きを読む

確率2%のくじ引きのシミュレーション

Graf Zeppelinのドロップが、だいたい2%くらいっぽいかもかも、ということで、実際に確率2%のくじ引きで当たりを引くまでの試行回数がどれくらいのバラツキを見せるのか、確認するための簡単なプログラムを書いてみました。

入手までの試行回数をキーとした辞書に入手した人数が入ります。

キーが500種類になるまで試行を繰り返すようになってます。これだと総試行回数は3千万回前後になる模様です。

結果なんですが、意外や、どうも、1回目とか2回目のチャレンジで入手するケースが最多になってしまって、ええーっ、ぷらずマジで!? 正直信じられないんですが、やり直せば違う結果も出るかもかもっぽいとはいえ、グラフを描くと左肩あがりのロングテールを描きます。3回やって3回同じグラフになった。

なので、数十ならともかく数百回S勝利して出ない、っていう人は、本当に、本当の本当に運が悪いっていえるのかも知れません。

なお、ついさっき試してみて、今回の試行では735回が最多チャレンジ数となりました。こんなん、もうやってられへんよね。

# -*- coding: utf-8-unix; mode: python -*-
import random

result = dict()
clg = 0

while len(result) < 500:
    cnt = 0
    havenot = True
    while havenot:
        cnt += 1
        clg += 1
        if random.randrange(50) == 1:
            if cnt in result:
                result[cnt] += 1
            else:
                result[cnt] = 1
            havenot = False

for key in range(max(result.keys()) + 1):
    if key in result:
        print('{0:>5}, {1:>3}, {2}%'.format(key, result[key],
        result[key] / clg * 100))
    else:
        print('{0:>5}, 0, 0%'.format(key))
print(',{0}'.format(clg))

結果も貼っとこう。長いので折り畳んどきます。

続きを読む

URLエンコードを使ってユニコード文字列をCookieにセットする

久しぶりにHTTP Cookieなど使ってみたら、さっぱりノウハウが消えてしまっていて思わぬ苦戦をしました。理由はいろいろあるけれど、日本語など非ASCII文字列をCookieに設定する場合、URLエンコードしないといけないなど、もろもろの仕様をすっかり忘れていたことや、よくよく考えたらPythonで書いてきたCGICookieにはSession IDを設定するだけで、フィールドに入る文字列などはSessionに記憶させてたから、URLエンコードする必要がなかったというのも大きかった。けれど、一番の問題は、IDLEで試してもうまくいかない、urllibでもurllib2でもいいんだけど、quoteでエンコードして、unquoteで戻した文字列が、おかしくなってしまうというところであったでしょう。

ああ、最初からprint()デバッグでやりゃあよかった。

ネットで調べても、あまり情報が出てきませんでした。なのでここに記録しておこうと思います。自分も含め、誰かの助けになればと思います。

import Cookie
import urllib2

cookie = Cookie.SimpleCookie()
value = u'スパム'

# 記録
cookie['value'] = urllib2.quote(value.encode(u'utf-8'))

# 読み出し
if cookie.has_key('value'):
    value = urllib2.unquote(cookie['value'].value)
    value = value.decode(u'utf-8')

マイベストソング2013、らしいよ

マイベストソング2013〈今年の1曲でiTunes Cardを当てよう! 私のマイベストソング2013♪〉

正直、このロゴでこられたなら、この曲をあげざるを得ない。

ダイヤモンドハッピー/ヒラリ/ヒトリ/キラリ

ダイヤモンドハッピー/ヒラリ/ヒトリ/キラリ

ダイヤモンドハッピー』、最高だと思います。ギター一本で歌えるようにできないものかと思っとる。

9月5日に買っていたもの

先生だって嘘をつく。 (2) (まんがタイムコミックス)

先生だって嘘をつく。 (2) (まんがタイムコミックス)

無邪気の楽園 4 (ジェッツコミックス)

無邪気の楽園 4 (ジェッツコミックス)

7月16日に届いていたもの

CD

TVアニメ ガールズ&パンツァー ファンディスクCD ディープパンツァーCDです!

TVアニメ ガールズ&パンツァー ファンディスクCD ディープパンツァーCDです!

ヨルムンガンド オリジナルサウンドトラック

ヨルムンガンド オリジナルサウンドトラック

TVアニメ 侵略!?イカ娘 ドラマCD3じゃなイカ?

TVアニメ 侵略!?イカ娘 ドラマCD3じゃなイカ?

パズル(DVD付)

パズル(DVD付)