見出し画像

だれでもポケカプログラミング その4 サイド落ちの確率②

前回の記事。

デッキ = ['たねポケ', 'たねポケ', 'たねポケ', 'たねポケ', 'たねポケ', 'たねポケ', 'たねポケ', 'たねポケ', 'たねポケ', 'たねポケ',
          'ボスの指令', 'ボスの指令', 'その他', 'その他', 'その他', 'その他', 'その他', 'その他', 'その他', 'その他',
          'その他', 'その他', 'その他', 'その他', 'その他', 'その他', 'その他', 'その他', 'その他', 'その他',
          'その他', 'その他', 'その他', 'その他', 'その他', 'その他', 'その他', 'その他', 'その他', 'その他',
          'その他', 'その他', 'その他', 'その他', 'その他', 'その他', 'その他', 'その他', 'その他', 'その他',
          'その他', 'その他', 'その他', 'その他', 'その他', 'その他', 'その他', 'その他', 'その他', 'その他']
  手札 = []

  サイド = []

  #デッキをシャッフル
  random.shuffle(デッキ)

  #手札を7枚引く
  for i in range(7):
    手札.append(デッキ.pop())

  #サイドに6枚引く
  for i in range(6):
    サイド.append(デッキ.pop())

前回作ったプログラムはこんな感じ。デッキから手札に7枚引いて、そのあとにサイドに6枚引く。

今回はこれを10万回まわしてサイドにボスの指令が落ちた回数をカウントするわけだが、ちゃんとマリガンを考慮してマリガンしたときは除外するようにする。単純にカードを6枚引いた場合とどれぐらい誤差があるか試してみましょう。

  if サイド.count('ボスの指令') == 2:
    サイド落ちカウント += 1

サイドにボスの指令が2枚とも落ちていた場合カウントしてみます。

試行回数 = 100000

for i in range(試行回数):

これを10万回繰り返します。あれ、今日は4行で終わってしまった。

#シャッフルに必要なもの
import random

試行回数 = 100000
マリガン回数カウント = 0
サイド落ちカウント = 0

for i in range(試行回数):

  デッキ = ['たねポケ', 'たねポケ', 'たねポケ', 'たねポケ', 'たねポケ', 'たねポケ', 'たねポケ', 'たねポケ', 'たねポケ', 'たねポケ',
          'ボスの指令', 'ボスの指令', 'その他', 'その他', 'その他', 'その他', 'その他', 'その他', 'その他', 'その他',
          'その他', 'その他', 'その他', 'その他', 'その他', 'その他', 'その他', 'その他', 'その他', 'その他',
          'その他', 'その他', 'その他', 'その他', 'その他', 'その他', 'その他', 'その他', 'その他', 'その他',
          'その他', 'その他', 'その他', 'その他', 'その他', 'その他', 'その他', 'その他', 'その他', 'その他',
          'その他', 'その他', 'その他', 'その他', 'その他', 'その他', 'その他', 'その他', 'その他', 'その他']
  手札 = []

  サイド = []

  #デッキをシャッフル
  random.shuffle(デッキ)

  #手札を7枚引く
  for i in range(7):
    手札.append(デッキ.pop())

  #たねポケが1枚もない場合マリガンカウント
  if 'たねポケ' not in 手札:
    マリガン回数カウント += 1
    continue

  #サイドに6枚引く
  for i in range(6):
    サイド.append(デッキ.pop())
  if サイド.count('ボスの指令') == 2:
    サイド落ちカウント += 1

マリガンになる確率 = マリガン回数カウント / 試行回数
print("試行回数\t" + str(試行回数))
print("マリガン回数カウント\t" + str(マリガン回数カウント))
print("マリガンになる確率\t" + '{:.2%}'.format(マリガンになる確率))
print("サイド落ちカウント\t" + str(サイド落ちカウント))
print("ボスの指令がサイドに2枚落ちる確率(マリガンは除外)\t" + '{:.2%}'.format(サイド落ちカウント / (試行回数 - マリガン回数カウント)))

最終系はこんな感じ。

試行回数 100000
マリガン回数カウント 26006
マリガンになる確率 26.01%
サイド落ちカウント 646
ボスの指令がサイドに2枚落ちる確率(マリガンは除外) 0.87%

1%以下なんですね。意外と少ないなあ。次はマリガンを考慮せずに単純に6枚カードを引いたときにボスの指令が2枚含まれている確率を出してみます。

#シャッフルに必要なもの
import random

試行回数 = 100000
マリガン回数カウント = 0
サイド落ちカウント = 0

for i in range(試行回数):

  デッキ = ['たねポケ', 'たねポケ', 'たねポケ', 'たねポケ', 'たねポケ', 'たねポケ', 'たねポケ', 'たねポケ', 'たねポケ', 'たねポケ',
          'ボスの指令', 'ボスの指令', 'その他', 'その他', 'その他', 'その他', 'その他', 'その他', 'その他', 'その他',
          'その他', 'その他', 'その他', 'その他', 'その他', 'その他', 'その他', 'その他', 'その他', 'その他',
          'その他', 'その他', 'その他', 'その他', 'その他', 'その他', 'その他', 'その他', 'その他', 'その他',
          'その他', 'その他', 'その他', 'その他', 'その他', 'その他', 'その他', 'その他', 'その他', 'その他',
          'その他', 'その他', 'その他', 'その他', 'その他', 'その他', 'その他', 'その他', 'その他', 'その他']
  手札 = []

  サイド = []

  #デッキをシャッフル
  random.shuffle(デッキ)

  #サイドに6枚引く
  for i in range(6):
    サイド.append(デッキ.pop())
  if サイド.count('ボスの指令') == 2:
    サイド落ちカウント += 1

サイド落ちになる確率 = サイド落ちカウント / 試行回数
print("試行回数\t" + str(試行回数))
print("サイド落ちカウント\t" + str(サイド落ちカウント))
print("サイド落ちになる確率\t" + '{:.2%}'.format(サイド落ちになる確率))

試行回数 100000
サイド落ちカウント 874
サイド落ちになる確率 0.87%

あれれ、同じ確率になってしまった。。。どっか間違ったかな?ほぼほぼ影響ない範囲の誤差だったということか。。。

次回はネオラントスタートになっちゃう確率でもやりますかあ。

#プログラミング
#python
#ポケカ
#プログラミング初心者
#python初心者
#ポケカ考察
#GoogleColab
#GoogleColaboratory

この記事が気に入ったらサポートをしてみませんか?