3. 확률과 비균등 분포
- 자연을 모방하기 위해서는 임의성에 모든 것을 맡겨서는 안 돼요.
random()를 이용해 비균등하게 숫자를 생성하는 것이 중요합니다.- 예) 유전 알고리즘의 구현
- 적자생존에 따르면, 현재 집단에서 다음 세대로 DNA를 전달할 대상들을 고르는 선택을 하게 되죠.
- 다윈의 진화론을 모방할 때는 '임의로 원숭이 2마리를 선택해 번식'시키기 보다 '생존에 적합한 원숭이들을 선택해 번식'시키는 것이 더 적합해요.
- 가령 적당한 속도와 힘을 가진 원숭이는 90% 확률로, 그렇지 못한 원숭이는 10% 확률로 번식하게 만들 수 있죠.
확률의 기본 원리
단일 사건이 일어날 확률
-
- 예) 에이스 카드를 뽑을 확률: (약 8%)
- 예) 다이아몬드 카드를 뽑을 확률: (약 25%)
어떤 사건이 함께 일어날 수 있는 확률
- 독립 사건의 확률들을 곱해주준 됩니다.
- 예) 동전 3번 던져서 모두 앞면이 나올 확률: = (약 12.5%)
연습문제 0.2
52개의 트럼프 카드에서 에이스 카드를 2번 연속해서 뽑을 확률은?
- 첫 뽑기 후 다시 섞는 경우
- (약 0.59%)
- 첫 뽑기 후 다시 섞지 않는 경우
- (약 0.45%)
random()으로 사건 발생 확률 조절
배열 이용
-
특정 숫자를 배열에 넣고, 확률적으로 높게 선택하고 싶은 요소는 여러 개를 배열에 넣은 후 해당 배열에서 임의의 요소를 선택하는 방법이 있어요.
- 아래 코드는 40%의 확률로 1, 3을 뽑고, 20% 확률로 2를 뽑습니다.
// 배열에 1과 3을 더 많이 넣어 확률 조절
const stuff = [1, 1, 2, 3, 3];
const value = random(stuff);
text(value, width / 2, height / 2);
범위 이용
-
**
random()**으로 생성된 숫자(0~1 부동소수점 값)가 특정 범위에 있을 때 사건이 발생하게 만들 수도 있어요.// 10%의 확률
const probability = 0.1;
const r = random(1);
if (r < probability) {
console.log("Sing!");
} -
여러 개의 사건에 확률을 다르게 적용할 수도 있죠.
- 0.0 ~ 0.6 (60%) → 사건A
- 0.6 ~ 0.7 (10%) → 사건B
- 0.7 ~ 1.0 (30%) → 사건C
const num = random(1);
if (num < 0.6) {
console.log("Sing!");
} else if (num < 0.7) {
console.log("Dance!");
} else {
console.log("Sleep!");
}
워커 객체에 적용하기
- 워커 객체가 오른쪽 방향으로 움직이는 경향을 갖도록 만들어 볼게요.
- 오른쪽으로 움직일 확률: 40%
- 왼쪽으로 움직일 확률: 20%
- 위로 움직일 확률: 20%
- 아래로 움직일 확률: 20%
step() {
const r = random(1);
if (r < 0.4) {
this.x++;
} else if (r < 0.6) {
this.x--;
} else if (r < 0.8) {
this.y++;
} else {
this.y--;
}
this.x = constrain(this.x, 0, width - 1);
this.y = constrain(this.y, 0, height - 1);
}