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

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

주요 내용

난수의 사용자 지정 분포

살다 보면 무작위 값이 (가우스 값이) 균일하게 분포된 상황을 원치 않을 때가 올 겁니다. 여러분이 음식점을 찾아 무작위 방향으로 걷고 있다고 가정해 봅시다. 공간을 무작위로 돌아다니며 음식점을 찾는 방법은 꽤 합리적인 전략 같습니다. 결국, 음식점이 어디에 있는지 모르므로 음식점을 찾을 때까지 무작위로 탐색할 겁니다. 문제는 무작위 방향으로 걷다보면 이전에 방문했던 장소에 여러 번 되돌아올 수 있다는 것입니다. (이것을 “과다 표집(oversampling)”이라 합니다.) 이 문제를 피하는 전략 중 하나는 중간에 큰 걸음으로 건너뛰는 것입니다. 이렇게 하면 주기적으로 한 번에 매우 멀리 이동하면서 특정 위치 주위를 탐색하여 과다 표집을 줄일 수 있습니다. 이런 식으로 무작위 걷기에 변형을 주려면 (레비 비행 - Lévy flight라고 알려짐) 사용자가 직접 확률 집합을 지정할 필요가 있습니다. 걸음이 길수록 선택될 가능성이 더 적고 걸음이 짧을수록 가능성이 큰 확률 분포를 설정하면 Lévy flight를 정확하게 구현할 수는 없어도 비슷하게 만들 수 있습니다.
본 절의 앞에서 배열을 값(일부는 중복되어 훨씬 자주 선택되었습니다.) 으로 채우거나 random()의 결과를 테스트함으로써 사용자 지정의 확률 분포를 생성할 수 있는 것을 살펴 보았습니다. 걷는 사람이 큰 조치를 취할 수 있는 기회가 1%라고 말함으로써 Lévy flight을 구현할 수 있습니다.
var r = random(1);
// A 1% chance of taking a large step
if (r < 0.01) {
  xstep = random(-100, 100);
  ystep = random(-100, 100);
} else {
  xstep = random(-1, 1);
  ystep = random(-1, 1);
}
하지만 이렇게 하면 확률이 어떤 고정된 경우의 수만큼 한정됩니다. 일반화된 규칙으로 수가 높을수록 선택 가능성이 더 크게 만들고 싶으면 어떻게 해야 할까요? 3.145가 3.144보다 선택될 가능성이 아주 약간 크더라도 바로 선택되도록 말이에요. 다시 말해서 x 가 난수라면, y = x같은 식으로 y-축에 선택 가능성을 나타낼 수 있습니다.
코드 본질에 관한 이미지
그림 I.4
위 그래프에 따라 난수의 분포를 생성하는 방법을 알아낼 수 있다면, 똑같은 방법으로 공식을 알고 있는 임의의 곡선에 적용할 수 있을 것입니다.
한 가지 해결 방안은 하나 대신 두 개의 난수를 선택하는 것입니다. 첫 번째 수는 일반 난수 입니다. 그러나 두 번째 난수는 “자격을 결정하는 임의의 값”입니다. 두 번째 수는 첫 번째 난수를 사용할 것인지 아니면 버리고 다른 값을 선택할지를 알려주는 역할을 합니다. 자격을 얻기 쉬운 숫자들이 좀 더 자주 선택되고 자격을 얻지 못한 숫자들은 드물게 선택될 것입니다. 아래에서 단계를 살펴봅시다. (우선은 0과 1 사이의 난수만을 고려합시다.)
  1. 난수 R1을 선택합니다.
  2. R1이 난수일 확률 P을 계산합니다. P = R1이라고 하겠습니다.
  3. 또 다른 난수 R2를 선택합니다.
  4. R2가 P 보다 작으면 난수를 찾은 겁니다—R1!
  5. R2가 P보다 작지 않으면 1 단계로 돌아가서 다시 시작합니다.
여기에서 임의로 뽑은 값이 난수 자격이 될 확률은 난수 그 자체의 값과 똑같다고 할 수 있습니다. R1의 값으로 0.1을 선택한다고 가정해 봅시다. 이것은 즉, R1이 난수일 확률이 10%라는 의미입니다. R1의 값으로 0.83을 선택하면 난수일 확률은 83% 입니다. 숫자가 높을수록 실제로 이용할 가능성이 커집니다.
이 함수는 위 알고리즘을 적용하여 0과 1 사이의 임의의 값을 반환하는 함수입니다 (이 함수는 Monte Carlo method에서 이름을 따왔으며 이 메소드의 이름은 Monte Carlo casino에서 유래한 것입니다.). 이 프로그램은 난수값으로 타원형의 크기를 조절하지만 실제로는 이 값으로 많은 일을 할 수 있습니다.

본 "내추럴 시뮬레이션" 과정은 다니엘 쉬프만(Daniel Shiffman)이 저술한 "The Nature of Code"의 내용을 차용한 것이며, 본 내용물의 저작권은 Creative Commons Attribution-NonCommercial 3.0 Unported License를 적용합니다.