最新の記事 [RSS]
消費者庁に怒られない確率プログラミング 彩花先生みん先生 アラハビカ編 スライム倒して300年、知らないうちにレベルMAXになってました 盛りすぎココアさん ClockRoom '18 - そして元の位置に戻す 反省会 2017 冬休みスタート 歳末ガンガン祭り スロウ2018Q1上手

消費者庁に怒られない確率プログラミング

[画像] 召喚提供割合

確率2%なのに130回も回してひとつも出ないよね、実際。 という話。 プログラムがおかしいんじゃないのって思っちゃうけど、ここがおかしいと本当に消費者庁に怒られた挙句にプラットフォームから締め出されるので、最も神経つかってるはず。 それじゃあ、なんで出ないのって、それは所詮確率だから? 「2%」の内訳が50分の1かもしれないし、100万分の2万かもしれないし。

擬似乱数の実装の多くは「一様分布」で「周期性が適切」らしいので、初期化だけ気をつければ使って問題ない。 アプリをはじめて起動したときにシード値を決定して、過去の抽選回数と同じ回数だけ擬似乱数を空回し・・・ やってられるか(爆)

確率2%と聞いて自然に想像するのは以下のような抽選だと思う ────

  1. 抽選箱に当たり2枚、はずれ98枚のクジを入れる
  2. 抽選箱からクジを1枚引く
  3. 引いたクジは結果に関係なく破棄する
  4. 次の抽選を行なう
  5. 抽選箱が空になったら最初に戻る

このルールに従って「はずれを引き続ける確率」を計算すると99回目で0%になる。 98連続はずれを引いたら当たりしか残らないので、理屈も計算もバッチリ!

  1. 98/100 = 98%
  2. 98/100 * 97/99 = 96%
  3. 98/100 * 97/99 * 96/98 = 94%
  4. 98/100 * 97/99 * 96/98 … 0/2 = 0%

逆にこのあたりをよく考えずに実装すると大変なことになる。 例えば、良かれと思って抽選毎にシード値を変えてしまうと・・・

  1. 抽選箱に当たり2枚、はずれ98枚のクジを入れる
  2. 抽選箱からクジを1枚引く
  3. 引いたクジの結果に関係なく抽選箱を破棄して最初に戻る
  1. 98/100 = 98%
  2. 98/100 * 98/100 = 96%
  3. 98/100 * 98/100 * 98/100 = 94%
  4. 98/100 * 98/100 * 98/100 … 98/100 = (98/100)^n

おわかりいただけただろうか? 「はずれを引き続ける確率」は0%に漸近するが、決して0%にはならない。 結果が独立しているべき「サイコロ」なら問題ないが、「抽選」でこれはまずい。 王様ゲームで王様が複数名現れてしまう。 227連続はずれを引いて228回目もはずれの確率がなお1%。 これでは公称の確率から大きく離れてしまい、消費者庁に怒られる((;゜Д゜)

ではどうするか。 最初に述べたとおり、初期化だけ気をつければ擬似乱数でも構わない。 擬似乱数が信用できない、もしくは、ある程度コントロールしたいなどの場合、前者の抽選箱をそのまま実装するのが手っ取り早くて間違いない。 ちなみに、最近のソシャゲはもう少し複雑(厄介?)らしいですよ、よく知らんけど。

2018年 2月 12日 [この記事のURL] [コメント]


コメント


名前
内容
送信

※“http://”を含む送信はできません。