본문 바로가기
p5.js

[p5.js / The nature of code] 0. Randomness(무작위성) - 0.4 A Normal Distribution of Random Numbers(임의 숫자의 정규 분포)

by the_cat_Soy 2024. 4. 23.
 

Examples

 

natureofcode.com

 

Normal Distribution of Random Numbers(임의 숫자의 정규 분포)

 

정규 분포를 사용하여 난수의 비균일한 분포를 생성하는 또 다른 방법은 숫자가 평균 값 주변에 집중되도록 하는 것입니다. 이것이 유용한 이유를 이해하기 위해, 모의로 생성된 원숭이 모집단으로 돌아가서, 여러분이 만든 스케치가 200부터 300까지의 랜덤한 키 값을 가진 천 개의 원숭이 객체를 생성한다고 가정해 봅시다(이것은 픽셀 단위의 키를 가진 원숭이의 세계입니다).

let h = random(200, 300);

 

 이 알고리즘은 원숭이 키의 모집단을 생성하는 정확한 방법을 제공합니다. 뉴욕 시내의 붐비는 보도를 상상해 보세요. 거리에서 아무 사람이나 선택하면 그들의 키는 무작위로 보일 수 있습니다. 그러나 이것은 기본적으로 random()이 생성하는 종류의 무작위가 아닙니다. 사람들의 키는 균일하게 분포되어 있지 않습니다. 평균 키 주변에 있는 사람들이 많고, 아주 키가 크거나 아주 작은 사람들보다는 훨씬 많습니다. 이 모집단을 정확하게 반영하기 위해, 평균에 가까운 무작위 키가 선택될 가능성이 높아져야 하고, 아주 작거나 아주 큰 키는 더 드물어져야 합니다.

 

 이것이 바로 정규 분포(가우시안 분포라고도 함, 수학자 칼 프리드리히 행스의 이름에서 따온)가 작동하는 방식입니다. 이 분포의 그래프는 비공식적으로 벨 곡선으로 알려져 있습니다. 곡선은 평균(일반적으로 그리스 문자 뮤(μ)로 표기됨)과 표준 편차(그리스 문자 시그마(σ)로 표기됨)의 함수로서 어떤 주어진 값이 발생할 확률을 정의하는 수학적 함수에 의해 생성됩니다.

 

 200에서 300까지의 키 값의 경우, 평균(평균)을 250으로 간주할 것으로 예상됩니다. 그러나 표준 편차가 3이라고 말한다면 어떻게 될까요? 아니면 15일 경우는 어떻게 될까요? 이것이 숫자에 미치는 영향은 Figure 0.2에 그려진 그래프들이 힌트를 줄 것입니다.

 

 

 왼쪽은 표준 편차가 매우 낮은 분포로, 값의 대다수가 평균 주변에 쌓이며(표준에서 크게 벗어나지 않습니다). 오른쪽 버전은 표준 편차가 더 높기 때문에 값들이 평균으로부터 더 고르게 퍼져 있습니다(더 많이 벗어납니다).

 

 숫자는 다음과 같이 계산됩니다: 주어진 모집단에서 68퍼센트의 구성원은 평균으로부터 한 표준 편차 범위 내에 값을 가지며, 95퍼센트는 두 표준 편차 내에 있고, 99.7퍼센트는 세 표준 편차 내에 있습니다. 표준 편차가 5픽셀로 주어진 경우, 원숭이 키 중 0.3퍼센트만이 평균 250의 세 표준 편차 아래인 235픽셀보다 작거나 평균 250의 세 표준 편차 위인 265픽셀보다 큰 값일 것입니다. 한편, 원숭이 키의 68퍼센트는 245에서 255픽셀 사이일 것입니다.

 

 행운히도, p5.js 스케치에서 정규 분포의 무작위 숫자를 사용하기 위해 이러한 계산을 수동으로 수행할 필요가 없습니다. 대신, randomGaussian() 함수가 수학을 처리하고 정규 분포를 가진 무작위 숫자를 반환해 줍니다.

function draw() {
  let num = randomGaussian(); //Ask for a Gaussian random number.
}

 

평균과 표준 편차 계산하기


 10명의 학생들이 시험에서 다음과 같은 점수(100점 만점)를 받았다고 가정해봅시다: 85, 82, 88, 86, 85, 93, 98, 40, 73 및 83.
평균은 평균값입니다: 81.3입니다.

 표준 편차는 평균 주변의 편차의 제곱의 평균의 제곱근으로 계산됩니다. 다시 말해, 각 학생의 점수와 평균 간의 차이를 취하여 제곱한 후, 해당 학생의 제곱 편차를 얻게 됩니다. 그런 다음, 이러한 모든 값의 평균을 계산하여 평균 분산을 얻습니다. 그런 다음, 평균 분산의 제곱근을 취하면 표준 편차를 얻을 수 있습니다.



표준 편차는 분산의 제곱근입니다: 15.13입니다.

 

 

다음 단계는 만약 예를 들어, 모양을 그릴 때 x-위치를 할당하는 것이 목표라면 어떨까요?

 

기본적으로, randomGaussian() 함수는 평균이 0이고 표준 편차가 1인 정규 분포의 무작위 양수와 음수를 반환합니다. 이것은 표준 정규 분포로도 알려져 있습니다. 그러나 종종 이러한 기본 매개변수는 작동하지 않을 수 있습니다. 예를 들어, 모양의 x-위치를 640픽셀 너비의 창에서 가운데 수평 픽셀 320을 기준으로 정규 분포를 사용하여 무작위로 할당하려면, 평균이 320이고 표준 편차가 60 픽셀인 정규 분포를 사용하려고 합니다. 이 경우, randomGaussian() 함수에 두 개의 인수를 전달하여 매개변수를 조정할 수 있습니다: 평균 다음에 표준 편차를 전달합니다.

 

Example 0.4: A Gaussian Distribution

https://editor.p5js.org/natureofcode/sketches/Yk_eSiNOR

function draw() {
  let x = randomGaussian(320, 60);
  //A normal distribution with mean 320 and standard deviation 60

  noStroke();
  fill(0, 10);
  circle(x, 120, 16);
}

 

 여기서는 randomGaussian() 호출을 사용자 정의하기 위해 매개변수를 사용했지만, 이러한 사용자 정의를 구현하기 위한 수학은 매우 간단합니다: 표준 정규 분포에서 값을 가져와 표준 편차로 곱한 다음 평균을 더하기만 하면 됩니다. 다시 말해, randomGaussian(320, 60)에 x를 할당하는 것은 다음과 동일합니다:

let x = 60 * randomGaussian() + 320;

 

 서로 위에 투명도를 가지고 원을 그리면 분포를 조금씩 볼 수 있습니다. 가장 어두운 곳은 대부분의 값이 모이는 중심 근처입니다. 그러나 가끔씩 중심에서 오른쪽이나 왼쪽으로 더 멀리 떨어진 곳에 원이 그려집니다.

Exercise 0.4
그림으로 그려진 페인트 스플래터의 시뮬레이션을 고려해보세요. 대부분의 페인트는 중앙 위치 주변에 군집되어 있지만, 일부 점들은 가장자리 쪽으로 흩뿌려집니다. 점의 위치를 생성하기 위해 정규 분포의 난수를 사용할 수 있습니다. 또한, 정규 분포의 난수를 사용하여 색상 팔레트를 생성할 수도 있습니다. 표준 편차를 조절하는 슬라이더를 만들어서 결과를 조절해보세요.
Exercise 0.5
가우시안 랜덤 워크는 한 방향으로 물체가 얼마나 멀리 움직이는지에 대한 단계 크기가 정규 분포로 생성되는 경우로 정의됩니다. Walker 클래스의 이러한 변형을 구현하세요.