If you're seeing this message, it means we're having trouble loading external resources on our website.

웹 필터가 올바르게 작동하지 않으면 도메인 *. kastatic.org*.kasandbox.org이 차단되어 있는지 확인하세요.

주요 내용

난수의 정규분포

원숭이가 사는 세계를 구현하는 프로그램을 만든다고 가정해 봅시다. 이 프로그램은 키가 200에서 300 사이인 원숭이 객체 천 개를 생성할 수 있습니다(이 세계에서 원숭이의 키는 200에서 300픽셀 사이입니다).
var randomHeight = random(200, 300);
위 프로그램이 과연 현실의 원숭이의 키를 정확하게 묘사할까요? 도시의 붐비는 인도를 생각해 보세요. 거리에 있는 사람들의 키는 임의로 분포되어 있다고 볼 수 있습니다. 그럼에도 불구하고 random() 함수가 생성하는 난수성과는 다른 특성을 가지고 있습니다. 사람들의 키는 균등하게 분포되지 않습니다. 평균 키를 가진 사람이 매우 크거나 매우 작은 사람보다 훨씬 더 많습니다. 이런 자연적인 특성을 묘사하려면 키가 평균(250 픽셀)인 원숭이의 수가 많으면서 키가 매우 작거나 매우 큰 원숭이들도 어느 정도 존재하도록 만들어야 합니다.
평균(산술평균) 근처에 값이 모여 있는 분포를 “정규 분포”라 합니다. 정규 분포는 (수학자 카를 프리드리히 가우스(Carl Friedrich Gauss)의 이름을 따서) 가우스 분포라고도 합니다. 프랑스에서는(피에르 시몽 라플라스(Pierre-Simon Laplace)의 이름을 따서) 라플라시안 분포라고도 합니다. 두 수학자는 19세기 초기에 이러한 분포를 정의하는 연구를 했습니다.
정규분포를 그래프로 그리면 다음과 같습니다. 이런 형태의 그래프는 종형 곡선이라 합니다.
표준 종형 곡선 그래프
표준 종형 곡선
이 곡선은 평균(그리스 문자 μ, ) 과 표준편차(그리스 문자 σ,시그마) 로 이루어진 함수가 내놓는 값의 확률을 정의하는 함수를 시각적으로 나타낸 것입니다.
평균의 개념은 이해가 쉽습니다. 200과 300 사이의 높이 값의 경우 직관적으로 평균(산술평균)이 250인 것을 알 수 있습니다. 그러나 표준편차가 3 또는 15라고 하면 어떨까요? 이 수는 무엇을 의미할까요? 그래프를 보고 힌트를 얻어보세요. 위 그래프는 대다수 값이 평균 주위에 몰려 있는 매우 낮은 표준 편차를 가진 분포를 나타냅니다. 아래 그래프는 값들이 평균에서 좀 더 고르게 퍼져 있는 보다 높은 표준 편차를 나타냅니다.
높은 표준 편차를 갖는 종형 곡선 그래프
높은 표준편차를 갖는 종형 곡선
"표준편차"의 개념에 익숙하지 않습니까? 걱정 마세요! 계속하기 전에 칸아카데미에서 분산과 표준편차를 배울 수 있습니다.
다음과 같은 수를 생각해 봅시다. 인구의 68%는 표준편차가 평균으로부터 1 범위내, 95%는 표준편차가 2 , 99.7%는 표준편차가 3 입니다. 표준편차가 5 픽셀이면 원숭이 인구 중 0.3%의 키는 235 픽셀(평균 250, 표준편차 3 에서 아래 구간)보다 작거나 265 픽셀(평균 250, 표준편차 3 에서 위 구간)보다 클 것입니다.

평균과 표준편차 계산하기
어떤 시험에서 (100점 중) 다음과 같은 성적을 받은 10명의 학생들을 살펴봅시다.
85, 82, 88, 86, 85, 93, 98, 40, 73, 83
평균은 모든 점수를 더한 뒤 점수의 개수로 나누어주면 됩니다.
평균 = (85+82+88+86+85+93+98+40+73+83)/10=81.3
표준편차는 평균과의 편차의 제곱의 평균의 양의 제곱근으로 계산됩니다.
첫 번째로 할 일은 각 점수의 편차(평균과의 차이)를 계산한 뒤 편차의 제곱을 계산합니다.
점수편차제곱 편차
858581.3=3.7(3.7)2=13.69
828281.3=0.7(0.7)2=0.49
888881.3=6.7(6.7)2=44.89
868881.3=4.7(4.7)2=22.09
858581.3=3.7(3.7)2=13.69
939381.3=11.7(11.7)2=136.89
989881.3=16.7(16.7)2=278.89
404081.3=41.3(41.3)2=1705.69
737381.3=8.3(8.3)2=68.89
838381.3=1.7(1.7)2=2.89
그다음 제곱 편차의 평균인 분산을 계산합니다. 이는 마지막 열을 모두 더한 뒤 행의 개수로 나눈 것입니다.
분산 = 2288.1/10 = 228.81
먼저 분산의 제곱을 계산하여 표준편차를 계산합니다:
표준편차 = 228.81 = 15.13.
표준편차를 좀 더 알고 싶으세요? 칸아카데미의 분산과 표준편차에서 더 깊게 공부할 수 있습니다.

다행스럽게도 프로그램에서 난수를 정규분포화 시키기 위해 이런 계산을 직접 할 필요는 없습니다. 대신 ProcessingJS 에서 제공되는 Random 객체를 이용하면 됩니다.
Random을 사용하려면 먼저 새로운 Random 객체를 인스턴스화 하고 매개변수로 1을 입력합니다. 이 변수를 "생성기(generator)"라고 합니다. 이렇게 탄생한 코드는 기본적으로 난수 생성기의 역할을 하기 때문입니다.
var generator = new Random(1);
draw()를 수행할 때마다 정규(가우스)분포를 갖는 난수를 생성하고자 한다면 간단하게 함수 nextGaussian()를 호출하면 됩니다.
var num = generator.nextGaussian();
println(num);
그럼 이제 이 값으로 무엇을 해야 할까요? 만약에 해당 값을 이용하여 화면에 그리려는 도형의 x-위치를 정하려면 어떻게 해야 할까요?
nextGaussian() 함수는 매개변수 0의 평균1의 표준편차 를 갖는 난수의 정규 분포를 반환합니다. 평균이 200(너비가 400인 윈도우의 중심 가로측 픽셀)이며 표준편차가 60픽셀인 것을 가정해 보겠습니다. 값에 표준 편차를 곱한 후 평균을 더하여 값을 매개변수의 값으로 조정할 수 있습니다.
var standardDeviation = 60;
var mean = 200;
var x = standardDeviation * num + mean;
이제 정규분포를 따라 반투명의 원을 그리는 프로그램을 만들 수 있습니다. 시간이 흐름에 따라 화면 중심 쪽에 값이 밀집되어 가장 어둡게 표시될 겁니다. 간혹 중심으로부터 오른쪽 또는 왼쪽으로 끝에서 원이 생성됩니다.

본 "Natural Simulations" 과정은 Creative Commons Attribution-NonCommercial 3.0 Unported License에서 이용된 Daniel Shiffman의 "The Nature of Code"에서 파생되었습니다.