문제 상황
100명의 죄수가 있습니다.
각 죄수에게 0부터 99까지의 번호가 부여됩니다.
100개의 박스가 있으며, 각 박스 안에는 0부터 99까지의 번호 중 하나가 들어 있습니다.
각 번호는 한 번만 나옵니다.
각 죄수는 박스를 최대 50개까지 열 수 있습니다.
죄수가 자신의 번호를 찾으면 다음 죄수가 시도합니다.
만약 죄수가 50개의 박스를 열어도 자신의 번호를 찾지 못하면 실패로 간주됩니다.
전체 코드
# 랜덤 모듈 임포트
import random
# 초기 변수 설정
n_prisoners = 100 # 죄수의 수
prisoners = list(range(n_prisoners)) # 0부터 99까지의 죄수 번호 리스트
boxes = [] # 박스의 내용 (초기화)
failures = 0 # 실패한 횟수
attempts = 1000 # 총 시도 횟수
# 1000번의 시도 동안 다음 단계 수행
for i in range(attempts):
boxes = list(prisoners) # 박스 안의 번호 섞기
random.shuffle(boxes)
for prisoner in prisoners: # 각 죄수에 대해 번호 뽑기
box_nr = prisoner
for turn in range(n_prisoners // 2): # 총 50개의 박스를 열 수 있음
if boxes[box_nr] == prisoner: # 자신의 번호를 뽑으면 반복 중지
break
box_nr = boxes[box_nr] # 그렇지 않으면 박스에 적힌 번호로 다음 박스 선택
else: # 만약 50개의 박스를 모두 열었는데도 자신의 번호를 찾지 못하면 실패로 간주
failures += 1 # 실패 횟수 추가
break # for 문 빠져나오기
print(f'{failures / attempts * 100}% 의 시도가 실패했습니다. ')
확률 시각화
시각화 적용 전체 코드 ↓
더보기
# 랜덤 모듈 임포트
import random
import matplotlib.pyplot as plt
# matplotlib 글씨체 변경
plt.rcParams['font.family'] ='Malgun Gothic'
plt.rcParams['axes.unicode_minus'] =False
# 초기 변수 설정
n_prisoners = 100 # 죄수의 수
prisoners = list(range(n_prisoners)) # 0부터 99까지의 죄수 번호 리스트
boxes = [] # 박스의 내용 (초기화)
failures = 0 # 실패한 횟수
attempts = 1000 # 총 시도 횟수
attempts_list = [] # 총 확률 저장하기
for i in range(100):
# 1000번의 시도 동안 다음 단계 수행
for i in range(attempts):
boxes = list(prisoners) # 박스 안의 번호 섞기
random.shuffle(boxes)
for prisoner in prisoners: # 각 죄수에 대해 번호 뽑기
box_nr = prisoner
for turn in range(n_prisoners // 2): # 총 50개의 박스를 열 수 있음
if boxes[box_nr] == prisoner: # 자신의 번호를 뽑으면 반복 중지
break
box_nr = boxes[box_nr] # 그렇지 않으면 박스에 적힌 번호로 다음 박스 선택
else: # 만약 50개의 박스를 모두 열었는데도 자신의 번호를 찾지 못하면 실패로 간주
failures += 1 # 실패 횟수 추가
break # for 문 빠져나오기
prob = failures / attempts * 100
attempts_list.append(prob)
boxes = []
failures = 0
print(attempts_list)
# 히스토그램 그래프
# plt.hist(attempts_list, bins=70, color='pink')
# plt.xlabel('실패확률')
# plt.ylabel('횟수')
# plt.show()
# 선그래프
# plt.plot(attempts_list, color='green')
# plt.ylabel('실패 확률')
# plt.title('시도별 실패 확률')
# plt.show()
# 산점도
# plt.scatter(range(len(attempts_list)), attempts_list, color='lightgreen')
# plt.xlabel('시도 번호')
# plt.ylabel('실패 확률')
# plt.title('시도별 실패 확률 산점도')
# plt.axhline(y=70, color='black', linestyle='--')
#
# plt.ylim(60, 90) # y축 범위 설정
#
# plt.show()
# 박스 플롯
# plt.boxplot(attempts_list)
# plt.ylabel('실패 확률')
# plt.title('실패 확률 박스 플롯')
# plt.show()
# 바이올린 플롯
# import seaborn as sns
#
# sns.violinplot(y=attempts_list, color='lavender')
# plt.ylabel('실패 확률')
# plt.title('실패 확률 바이올린 플롯')
# plt.show()
print(f'{failures / attempts * 100}% 의 시도가 실패했습니다. ')
히스토그램 그래프
# 히스토그램 그래프
# plt.hist(attempts_list, bins=70, color='pink')
# plt.xlabel('실패확률')
# plt.ylabel('횟수')
# plt.show()
선그래프
# 선그래프
plt.plot(attempts_list, color='green')
plt.ylabel('실패 확률')
plt.title('시도별 실패 확률')
plt.show()
산점도
# 산점도
plt.scatter(range(len(attempts_list)), attempts_list, color='lightgreen')
plt.xlabel('시도 번호')
plt.ylabel('실패 확률')
plt.title('시도별 실패 확률 산점도')
plt.axhline(y=70, color='black', linestyle='--')
plt.ylim(60, 90) # y축 범위 설정
plt.show()
박스 플롯 그래프
plt.boxplot(attempts_list)
plt.ylabel('실패 확률')
plt.title('실패 확률 박스 플롯')
plt.show()
바이올린 플롯
import seaborn as sns
sns.violinplot(y=attempts_list, color='lavender')
plt.ylabel('실패 확률')
plt.title('실패 확률 바이올린 플롯')
plt.show()
참고 링크
https://en.wikipedia.org/wiki/100_prisoners_problem
https://blogs.scientificamerican.com/observations/puzzling-prisoners/
참고 영상
참고 코드
'개발공부 > Python' 카테고리의 다른 글
[Python] matplotlib로 시간 흐름에 따른 개발 언어 인기도 분석하기 (0) | 2023.08.20 |
---|---|
[Python] 구글 코랩(colab) seaborn, matplotlib 한글 깨짐 현상 해결방법 (0) | 2023.08.20 |
[Python] 소상공인시장진흥공단 광주 상가 정보 시각화해보기 (0) | 2023.08.08 |
[Python] requirements.txt 생성하고 패키지 관리하기 (0) | 2023.07.28 |
[Python] 함수 실행 시간 측정하기 - time() 사용한 여러가지 방법 (0) | 2023.06.27 |