알고리즘

[Python&SQL] 동전의 앞면이 나올 확률은 ? Random

LeeSeunghyuk 2021. 1. 4. 10:30
반응형

동전을 던졌을 때 앞면이 나올 확률은 어떻게 될까요?

 

숫자를 사용해서 확률을 구해보겠습니다.

 

0 : 동전의 뒷면

1 : 동전의 앞면

 

0 , 1 중 랜덤으로 하나를 선택할 확률은

동전을 던졌을 때 앞면과 뒷면이 나올 확률과 같습니다.

 

### Python 동전 앞면 나올 확률 구하기

## Random module

 

파이썬의 랜덤 모듈을 사용합니다.

자세한 내용은 아래 주소에서 확인할 수 있습니다!

 

https://docs.python.org/3/library/random.html

 

random — Generate pseudo-random numbers — Python 3.9.1 documentation

random — Generate pseudo-random numbers Source code: Lib/random.py This module implements pseudo-random number generators for various distributions. For integers, there is uniform selection from a range. For sequences, there is uniform selection of a ran

docs.python.org

 

1. 0 or 1 랜덤으로 뽑아내기

 

2. 뒷면이 나올 확률 : 0 나온 횟수 / 전체 시행 횟수

   앞면이 나올 확률 : 전체 시행 횟수 - 0 나온 횟수 / 전체 시행 횟수  

 

3. 시각화

 

import random
import matplotlib.pyplot as plt

cnt=[0,0]

for _ in range(100):
    cnt[0]+=random.randint(0,1)
cnt[1]=100-cnt[0]

plt.pie(cnt,labels=['count 0','count 1'],autopct='%1.2f%%')

앞면은 49% , 뒷면은 51% 확률입니다.

 

10번 던졌을 때 앞면이 0 ~ 10번 나올 확률은 ?

 

import random
import matplotlib.pyplot as plt

res=[0]*11

for i in range(100000):
    cnt=sum([random.randint(0,1) for _ in range(10)])
    res[cnt]+=1

for i in range(11):
    print('앞면이 %s번 나올 확률 - %s'%(i,res[i]/100000))

plt.bar(range(11),res,tick_label=range(11))
plt.title('coin prob')
plt.ylabel('prob')
plt.xlabel('count')

 

" 동전을 10번 던져서 앞면이 나온 횟수 세보기 작업 "을

" 10만번 반복 " 한 결과입니다.

 

시각화를 하니 반반인 경우(5회)가 가장 많은 것을 

한 눈에 알 수 있습니다.

 

### SQL 동전 앞면 나올 확률 구하기

 

파이썬처럼 0과 1 두 수를 랜덤으로 확인합니다.

이 과정을 통해 동전의 앞면과 뒷면이 나올 확률을 확인해 보겠습니다.

 

## DBMS_RANDOM

 

파이썬의 random모듈 처럼 랜덤으로 숫자를 생성해주는

오라클 SQL의 패키지 입니다.

 

자세한 정보는 다음 링크에서 확인하시면 됩니다.

 

https://docs.oracle.com/database/121/ARPLS/d_random.htm#ARPLS67491

 

DBMS_RANDOM

VALUE Functions The basic function gets a random number, greater than or equal to 0 and less than 1, with 38 digits to the right of the decimal (38-digit precision). Alternatively, you can get a random Oracle number x, where x is greater than or equal to l

docs.oracle.com

 

1. 0 or 1 중 랜덤으로 수를 생성

 

2. grouping 작업을 통해 0과 1의 개수를 count

 

3. 뒷면 나올 확률 :  count(0) / 전체 시행 횟수

   앞면 나올 확률 :  count(1) / 전체 시행 횟수

 

-- 동전 한 번 던지기 입니다.
select dbms_random.value(0,1)
from dual;

--
select 동전의면, count(*)/&&수 확률
 from 
     (select round(dbms_random.value(0,1)) 동전의면
       from dual
       connect by level<=&수)
  group by 동전의면;

 

위의 쿼리대로 하시면 &수 에 대한 입력을 두 번 해야합니다.

( select 절에서 한 번 , from 절의 서브쿼리의 connect by 구문에서 한 번 )

 

다음과 같이 해결합니다.

 

 

※ 숫자 입력 1회로 바꾸기

 

        하나의 치환변수에 치환 변수 1개 추가(&&)

select 동전의면, count(*)/&&수 확률
  from 
       (select round(dbms_random.value(0,1)) 동전의면
          from dual
          connect by level<=&수)
group by 동전의면;

 

※ 매번 숫자를 입력하기

   

        undefine 사용

undefine 수

select 동전의면, count(*)/&&수 확률
  from 
       (select round(dbms_random.value(0,1)) 동전의면
          from dual
          connect by level<=&수)
group by 동전의면;

 

오늘은 동전의 한 면이 나올 확률을 구하는 알고리즘을 구현해보았습니다.

 

파이썬은 matplotlib 라이브러리를 사용해서 시각화까지 진행해 보았습니다.

 

읽어주셔서 감사합니다.

 

반응형