Last active
August 29, 2015 14:12
-
-
Save elzup/0c11f757334ba9ef7b1f to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# -*- coding: utf-8 -*- | |
u"""BINGO の確立をシミュレーションするスクリプト | |
input: | |
times = 抽選機を回す回数, card_num = カードの数 | |
outpu: | |
1本でも揃う確立 | |
""" | |
import sys | |
from random import sample | |
# 穴 | |
HIT = True | |
NOHIT = False | |
def generate_card(): | |
u"""カードを生成 | |
5x5で中心(3行3列)に穴が空いたカード | |
B(1列目) 1 - 15 | |
I(2列目) 16 - 30 | |
N(3列目) 31 - 45 | |
G(4列目) 46 - 60 | |
O(5列目) 61 - 75 | |
:returns: array card, length=25 | |
""" | |
cards = [] | |
for i in range(5): | |
cards.extend(sample(range(15 * i + 1, 15 * (i + 1)), 5)) | |
cards[12] = HIT | |
return cards | |
def check_bingo(card): | |
u"""BINGOしているかどうか | |
判定のみかえす | |
param: array | |
:returns: boolean | |
""" | |
if card.count(HIT) < 5: | |
return False | |
for i in range(5): | |
if NOHIT not in card[i * 5: (i + 1) * 5]: | |
return True | |
for i in range(5): | |
if NOHIT not in card[i: i + 21: 5]: | |
return True | |
if NOHIT not in card[0: 24: 6]: | |
return True | |
if NOHIT not in card[4: 21: 4]: | |
return True | |
return False | |
def print_card(card): | |
for i, v in enumerate(card): | |
if v == HIT: | |
v = "o" | |
elif v == NOHIT: | |
v = "x" | |
sys.stdout.write("%3s" % str(v)) | |
if (i % 5 == 4): | |
print() | |
print() | |
try: | |
times = int(sys.argv[1]) | |
except IndexError: | |
times = 5 | |
try: | |
card_num = int(sys.argv[2]) | |
except IndexError: | |
card_num = 10000 | |
hit_count = 0 | |
for i in range(card_num): | |
card = generate_card() | |
lots = sample(range(1, 76), times) | |
card_hole = [(HIT if (x == HIT or x in lots) else NOHIT) for x in card] | |
# print_card(card) | |
# print_card(card_hole) | |
if check_bingo(card_hole): | |
hit_count += 1 | |
print(str(times) + u"回目で1本でもBINGOしてる確立:") | |
p = hit_count / card_num | |
print("%s (%.1f %%)" % (str(p), p * 100)) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment