728x90
물건 5개 잇다 가정
차례대로 1,2,3,4,5번으로 지정하고
각각의 확률은 5%, 10%, 10%, 30%, 45%
누적확률을 이용하면
누적 확률은 5%, 15%, 25%, 55%, 100%
만약에 랜덤으로 뽑은 확률값이 70%가 나왔다. 그럼 누적확률 값을 사용해서 5%, 15%, 25%, 55%인 1번,2번,3번,4번 제외 100%인 5번이 선택되는것
여기서 주의할 점은 누적으로 더하는 확률값을 사용하기때문에 확률 순서거 적은것부터 정렬해서 계산되도록 해야한다.
float[] probs = new float[5]{5.0f, 10.0f, 10.0f, 30.0f, 45.0f}; //1, 2, 3, 4, 5
float totalProbs = 100.0f;
float randomValue = Random.value * totalProbs;
double cumulative = 0.0f;
for(int i=0; i<5; i++)
{
culValue += probs[i];
if(randomValue <= culValue)
{
return i;
}
}
반대로 누적으로 빼는 방법으로 하는 방법도 있음
뺀다면 확률이 큰거부터 정렬해서 계산되도록 해야되는거 말곤 같은듯
아래 유니티 사이트에서 예제 코드를 확인할수있음
https://docs.unity3d.com/kr/2017.4/Manual/RandomNumbers.html
728x90
'C#' 카테고리의 다른 글
서버 동기화 방식 (0) | 2021.07.23 |
---|---|
LINQ 쓸때 클로저랑 , 지연평가를 인지하고 유의해서 사용하자! (0) | 2021.07.23 |
C# - 유니티, 직렬화(Serialization) (0) | 2021.07.23 |
C# - 함수형 프로그래밍, 모나드 패턴 (0) | 2021.07.23 |
C# - 함수형 프로그래밍, 지연 - 캐시 기법 (0) | 2021.07.23 |