사건 공간(universe of events)
사건(event)
확률(probability)
import random
coin = ['H', 'T']
print(random.choice(dice))
random.choice()는 랜덤으로 'H', 'T'를 선택하여 리턴하는 함수
# 동전 1개를 10,000번 던지는 실험
# 앞면(H)이 나올 확률과 뒷면(T)이 나올 확률이 1/2임을 증명
heads = 0
tails = 0
trials = 10000
for i in range(trials):
choice = random.choice(coin)
if choice == 'H':
heads += 1
else:
tails += 1
print('P(H) = heads/10,000 =', heads/trials)
print('P(T) = tails/10,000 =', tails/trials)
P(H) = heads/10,000 = 0.5015
P(T) = tails/10,000 = 0.4985
# 동전 2개를 던지는 실험 (10,000번)
# 1) 앞면의 개수가 1개일 확률 1/2(HT, TH)
# 2) 첫 번째 동전이 앞면일 확률 1/2(HH, HT)
# 3) 적어도 한 개의 동전이 앞면일 확률 3/4(HH, HT, TH)
trials = 10000
coin2 = ['HH', 'HT', 'TH', 'TT']
events = []
for i in range(4):
events.append(0)
for i in range(trials):
choice = random.choice(coin2)
if choice == 'HH':
events[0] += 1
elif choice == 'HT':
events[1] += 1
elif choice == 'TH':
events[2] += 1
else:
events[3] += 1
print(f'앞면의 개수가 1개일 확률 ={(events[1] + events[2]) / trials}')
print(f'첫 번째 동전이 앞면일 확률 ={(events[0] + events[1]) / trials}')
print(f'적어도 한 개의 동전이 앞면일 확률 ={(events[0] + events[1] + events[2]) / trials}')
#1) 앞면의 개수가 1개일 확률 1/2(HT, TH)
def experiment(type, n, t):
"""
:param type: 실험 타입(동전 던지기 or 주사위 던지기)
:param n: 동전의 개수
:param t: 실험 회수
:return: 리스트
"""
cases = [] # 동전 던지기 실험 결과를 저장할 리스트
for _ in range(t): # 실험 회수 만큼 반복
case = [] # 각 실험의 결과를 저장1
for _ in range(n): # 동전 개수만큼 반복
rand = random.choice(type) # 'H' or 'T'
case.append(rand) # 1회 실험 결과에 저장
# 1회 실험이 끝날 때마다 각 실험 결과를 tuple로 저장
# tuple의 개수는 셀수 있지만, list의 개수는 셀 수 없음
cases.append(tuple(case))
return cases
coin_exp = experiment(coin, 2, 10000)
print(coin_exp[0:10]) # 첫 10개의 실험 결과 확인
coin_event_counts = Counter(coin_exp)
prihnt( coin _event _ counts)
print( coin_event_counts)
Counter({('T', 'H'): 2582, ('H', 'T'): 2493, ('H', 'H'): 2484, ('T', 'T'): 2441})
☆★☆★
def how_many_heads(x):
counter = Counter(x)
return counter['H']
num_of_cases = 0
for ev, cnt in coin_event_counts.items():
if how_many_heads(ev) == 1: # key = 'H' value = 1 이 나오는 경우
num_of_cases += cnt
p_h1 = num_of_cases / trials
print('P(앞면이 1개일 확률', p_h1)
Counter({'T': 1, 'H': 1})
Counter({'H': 1, 'T': 1})
Counter({'T': 2})
Counter({'H': 2})
P(앞면이 1개일 확률) = 0.5075
# 2) 첫 번째 동전이 앞면일 확률 1/2(HH, HT)
num_of_cases = 0
for ev, cnt in coin_event_counts.items():
if ev[0] == 'H':
# if ev ==('H', 'H') or ev == ('H', 'T'):
num_of_cases += cnt
p_first_h = num_of_cases / trials
print('P(첫번째 동전이 앞면) =', p_first_h)
P(첫번째 동전이 앞면) = 0.4991
# 3) 적어도 한 개의 동전이 앞면일 확률 3/4(HH, HT, TH)
num_of_cases = 0
for ev , cnt in coin_event_counts.items():
if how_many_heads(ev) == 1 or how_many_heads(ev) == 2:
num_of_cases += cnt
p = num_of_cases / trials
print('P(적어도 1개가 앞면) =', p)
P(적어도 1개가 앞면) = 0.7449
# 여사건 이용
num_of_cases = 0
for ev , cnt in coin_event_counts.items():
if how_many_heads(ev) == 0:
num_of_cases += cnt
p = 1 - (num_of_cases / trials)
print('P(적어도 1개가 앞면) =', p)
P(적어도 1개가 앞면) = 0.7449
# 주사위 2개를 던졌을 때, 두 눈의 합이 8일 확률은?
dice_exp = experiment(dice, 2, 10_000)
print(dice_exp[0:5])
event_counts = Counter(dice_exp)
print(len(event_counts))
print(event_counts)
num_of_cases = 0
for ev, cnt in event_counts.items():
# if ev[0] + ev[1] == 8:
if sum(ev) == 8:
num_of_cases += cnt
p = num_of_cases / trials
print('P(두 눈의 합=8) =', p, 5/36)
# 주사위 2개를 던졌을 때, 적어도 하나가 짝수가 나올 확률?
num_of_cases = 0
for ev, cnt in event_counts.items():
if ev[0] % 2 == 0 or ev[1] % 2 == 0:
num_of_cases += cnt