A.I(인공지능)/Datascience

주사위게임에서 특정확률을 시뮬레이션을 통해 해결해보자!

JackSmith 2024. 10. 20.

※문제

아래 문제를 풀어보자!

 

주사위게임에서 시뮬레이션을 진행할때 주사위를 굴리는 것은 중요한 부분이다. 각 경우의 수가 나올 확률이 균일하다고 가정할때, 주사위 2개를 굴려 나올 수 있는 값의 합이 7이 될 확률은 얼마인가요?

 

우선 큰수의 법칙에 따라 1만번의 시뮬레이션을 수행하기로 한다.

이때 한번의 시뮬레이션 안에서 주사위를 2번 굴리고 그 합이 7이 나오냐를 여부를 if문으로 따져서, 참일 경우 카운트를 +1하도록 구현하면 될 것 같다.

import numpy as np
array = [1,2,3,4,5,6]
histogram_cnt_7 = 0
count = 10000
for _ in range(count):
    choice1 = np.random.choice(array)
    choice2 = np.random.choice(array)
    sum = choice1 + choice2
    if sum == 7:
        histogram_cnt_7 = histogram_cnt_7 + 1
ratio = histogram_cnt_7/count
print(f" 주사위 2개를 굴렸을 때 나올 수 있는 값의 합이 7이 될 확률: {ratio}")

 

이때 결과는 다음과 같다.

주사위 2개를 굴렸을 때 나올 수 있는 값의 합이 7이 될 확률: 0.1667

 

 

※추가

이번에는 좀더 이해를 돕기 위해 주사위 합의 분포를 히스토그램화 시켜서 나타내어 어떤 합이 더 빈도수가 높게 나오는지 7과 비교해서 확인해보자.

import numpy as np
import matplotlib.pyplot as plt

# 모든 가능한 주사위 결과의 합을 구하는 함수
def simulate_dice_rolls():
    dice1 = np.arange(1, 7)  # 첫 번째 주사위의 값
    dice2 = np.arange(1, 7)  # 두 번째 주사위의 값
    outcomes = np.add.outer(dice1, dice2)  # 두 주사위의 합
    return outcomes

# 주사위 합의 확률을 계산하는 함수
def calculate_probability_of_sum(target_sum, outcomes):
    total_rolls = outcomes.size
    favorable_rolls = np.count_nonzero(outcomes == target_sum)
    return favorable_rolls / total_rolls

# 주사위 굴리기 결과 시뮬레이션
outcomes = simulate_dice_rolls()

# 확률 계산
target_sum = 7
prob_7 = calculate_probability_of_sum(target_sum, outcomes)

# 시각화
sums, counts = np.unique(outcomes, return_counts=True)

plt.figure(figsize=(10, 6))
plt.bar(sums, counts / counts.sum(), color='skyblue', edgecolor='black')
plt.axvline(target_sum, color='red', linestyle='--', label=f'Sum = {target_sum}')
plt.title('Probability Distribution of the Sum of Two Dice Rolls', fontsize=14)
plt.xlabel('Sum of Two Dice', fontsize=12)
plt.ylabel('Probability', fontsize=12)
plt.legend()
plt.show()

print(f"두 주사위의 합이 7이 나올 확률: {prob_7:0.3}")

 

결과는 다음과 같다.

 

※ 고찰

위 시각화를 통해 7이 나올 가능성이 상대적으로 높다는 것을 입증할 수 있었다.

 

댓글