소연의_개발일지
article thumbnail

 

문제 상황

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

 

100 prisoners problem - Wikipedia

From Wikipedia, the free encyclopedia Mathematics problem Each prisoner has to find their own number in one of 100 drawers, but may open only 50 of the drawers. The 100 prisoners problem is a mathematical problem in probability theory and combinatorics. In

en.wikipedia.org

https://blogs.scientificamerican.com/observations/puzzling-prisoners/

 

Puzzling Prisoners Presented to Promote North America's Only Museum of Math

 

blogs.scientificamerican.com

참고 영상

https://youtu.be/vIdStMTgNl0

https://youtu.be/PE4vLbyOgw0

 

참고 코드

https://stackoverflow.com/questions/73256597/is-there-a-better-approach-to-the-proof-code-of-100-prisoners-question

 

Is there a better approach to the proof code of "100 prisoners" question?

Well, I'm quite a beginner and need some help and advice. Sometime ago i watched this video about 100 prisoners question and wanted to write a proof program to see if the ratio really approaches to...

stackoverflow.com

 

profile

소연의_개발일지

@ssoyxon

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!