Skip to content

Instantly share code, notes, and snippets.

@elzup
Last active August 29, 2015 14:12
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save elzup/0c11f757334ba9ef7b1f to your computer and use it in GitHub Desktop.
Save elzup/0c11f757334ba9ef7b1f to your computer and use it in GitHub Desktop.
# -*- 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