python練習問題〜シリーズ1第3回派生、レベル超初級の初級3+α〜

Python

前回のおさらい

さて、前回まででカード4枚、カードマークあり、まで到達しました。ここまでくると一旦、どのくらいの確率で各手役が出るのか計測していきたいと思います。

参考までに、前回の記事は以下です。

連載回数カードの前提
第1回山札20枚、カード3枚ドロー、数値1〜5、カードマークなし
第2回山札52枚、カード4枚ドロー、数値1〜13、カードマークなし
第3回山札52枚、カード4枚ドロー、数値1〜13、カードマークあり
第3+α回第3回ベースで役の出現回数を把握しよう
第4回山札52枚、カード5枚ドロー、数値1〜13、カードマークあり

ゴール(手役の出現確率を表示する)

こんな感じの内容がアウトプットされれば成功です(山札やドローが毎回変わりますので、どんなカードが配られるか、手役が何かは当然違いますが)

terminal表示結果:10000回施行

第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枚引くことにするので、それが終わってから本当の役の出現確率を確認したいと思います。

Python
Advertisements
シェアする
ks_Accountingをフォローする
経営管理deプログラミング

コメント