다른 확률을 가진 아이템을 선택하기
- 서로 다른 확률을 가진 행동을 paper strip으로 생각해볼 수 있다.
- 50%의 확률로 반겨주기
- 25% 확률로 도주
- 20% 확률로 갑작스러운 공격
- 5% 확률로 돈을 선물
인자: probs 각 항목에 대한 다른 확률을 배열로 가지고 있음
- probs ⇒ [0.5, 0.25, 0.2, 0.05]
randomPoint : 위의 스트렙에서의 위치 값
- Random.Value → 0.8 이면, 20% 확률로 갑작스러운 공격에 해당하는 행동을 한다.
float Choose (float[] probs) {
float total = 0;
foreach (float elem in probs) {
total += elem; // 각 확률의 총합
}
// Random.value 0 ~ 1 사이의 숫자
float randomPoint = Random.value * total;
for (int i= 0; i < probs.Length; i++) {
if (randomPoint < probs[i]) { // i번째 확률에 들어 왔는가
return i; // probs의 인덱스를 반환
}
else {
randomPoint -= probs[i]; // probs[i]는 개별행동의 확률만 있기 때문
}
}
return probs.Length - 1; // 해당 되지 않는다면 마지막 행동에 해당하는 인덱스
}
배열 셔플
void Shuffle (int[] deck) {
for (int i = 0; i < deck.Length; i++) {
int temp = deck[i];
int randomIndex = Random.Range(0, deck.Length);
deck[i] = deck[randomIndex];
deck[randomIndex] = temp;
}
}
반복없이 항목의 집합에서 선택
10개의 스폰 포인터에 5명의 Npc를 랜덤으로 배치하기
첫번 째 Npc 배치 완료(5 / 10 == 0.5) → 두번째 Npc가 선택될 확률은 4 / 9 == 0.44 이다.
Transform[] spawnPoints;
Transform[] ChooseSet (int numRequired) {
Transform[] result = new Transform[numRequired]; // 몇 개를 뽑는 지
int numToChoose = numRequired;
for (int numLeft = spawnPoints.Length; numLeft > 0; numLeft--) { // 남은 스폰포인트 수
float prob = (float)numToChoose/(float)numLeft; // 선택할 수 / 남은 수 => 해당 Npc가 선택될 확률
if (Random.value <= prob) { // 확률 안으로 들어오면
numToChoose--; // 선택할 수 빼주고
result[numToChoose] = spawnPoints[numLeft - 1]; // result에 할당함 (4-3-2-1-0 순으로 담김)
if (numToChoose == 0) { // 다 선택 했으면 나가기
break;
}
}
}
return result;
}
공간의 임의의 지점
var randVec = Vector3(Random.value, Random.value, Random.value); // Random.value 는 0 ~ 1 의 값이다.
randVec * scaleValue // 길이가 1 단위인 큐브안의 공간에 scaleValue 스칼라를 곱해 스케일 업 할 수 있다.
// 정리 필요함
var randWithinRadius = Random.insideUnitSphere * radius; // 구체의 경우(즉 원점의 주어진 반경 안에 있는 랜덤 포인트를 원하는 경우) Random.insideUnitSphere를 원하는 반지름으로 곱하면 됩니다.
var randWithinCircle = Random.insideUnitCircle * radius; // ??