前回のおさらい
さて、前回まででカード4枚、カードマークあり、まで到達しました。ここまでくると一旦、どのくらいの確率で各手役が出るのか計測していきたいと思います。
参考までに、前回の記事は以下です。
連載回数 | カードの前提 |
第1回 | 山札20枚、カード3枚ドロー、数値1〜5、カードマークなし |
第2回 | 山札52枚、カード4枚ドロー、数値1〜13、カードマークなし |
第3回 | 山札52枚、カード4枚ドロー、数値1〜13、カードマークあり |
第3+α回 | 第3回ベースで役の出現回数を把握しよう |
第4回 | 山札52枚、カード5枚ドロー、数値1〜13、カードマークあり |
ゴール(手役の出現確率を表示する)
こんな感じの内容がアウトプットされれば成功です(山札やドローが毎回変わりますので、どんなカードが配られるか、手役が何かは当然違いますが)

第3+α回 役の出現率を表示してみよう
さて、実際のコードは以下。
import random
from pprint import pprint
class card:
def __init__(self, mark, num):
self.num = num
self.mark = mark
def pair_check(cards_num):
card_multi = 0
for s in set(cards_num):
if card_multi < cards_num.count(s):
card_multi = cards_num.count(s)
return card_multi
def mark_check(cards_mark):
mark_multi = 0
for s in set(cards_mark):
if mark_multi < cards_mark.count(s):
mark_multi = cards_mark.count(s)
return mark_multi
def check_roll(cards):
hand = [card for card in cards]
hand_nums = [c.num for c in hand]
hand_marks = [c.mark for c in hand]
if mark_check(hand_marks) == 4:
return 0 #flash
elif len(set(hand_nums)) == 3:
return 1 #1ペア
elif len(set(hand_nums)) == 2 and pair_check(hand_nums) == 3:
return 2 #3カード
elif len(set(hand_nums)) == 2 and pair_check(hand_nums) == 2:
return 3 #2ペア
elif len(set(hand_nums)) == 1:
return 4 #4カード
else:
return 5 #ブタ
if __name__ == '__main__':
bill = []
marks = ('♣', '♦', '♥', '♠')
roles = ("flash", "1ペア", "3カード", "2ペア", "4カード", "ブタ")
role_count = [0 for x in range(len(roles))]
count = 0
while count < 10000:
count += 1
bill = [card(k, j) for k in marks for j in range(1, 14)]
random.shuffle(bill)
hand = bill[:4]
"""
hand_nums = [c.num for c in hand]
hand_marks = [c.mark for c in hand]
"""
"""
for i in range(len(hand_nums)):
print("カード",i+1,":",hand_nums[i], hand_marks[i])
"""
roll = check_roll(hand)
role_count[roll] += 1
print("-"*20)
print('{}回施行結果'.format(count))
print("-"*20)
for i in range(len(roles)):
print('{}: {}回 確率:{}%'.format(roles[i], role_count[i], role_count[i] / count * 100))
基本これまでのコードを流用しつつ、どんな役かを表示させる機能(check_roll関数でのprint文)を削除しつつ、発生した役の出現数を把握するために、roll_count変数を設定して、各役ごとに発生たら1を足していくというシンプルな形です。
細かい説明は省略しますが、1万回施行してもものの1秒くらいで実施できますので、いつかは100万回とかで実施すると本当の意味で綺麗な施行分布になるのかもしれないですね。
まとめ
実際やってみるとフラッシュが思ったより出現してますね、1%もあるとは。そして、4カードは0.01%と非常に少ない。ただ、理論値より、2ペアの発生確率が引くのですが、これはやっぱりカードが少ないからなんでしょうね。
4回目はカードを5枚引くことにするので、それが終わってから本当の役の出現確率を確認したいと思います。