Python/Python기초

Python 44_확률

Codezoy 2020. 1. 21. 19:04


사건 공간(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