본문 바로가기
개발/android

게임에 꼭 필요한 난수, 간단하게 확률대로 발생시키기

by 매몰 2014. 9. 14.

 

확률 난수

 

 

게임을 만들때 수없이 사용되는 난수..

이런 난수는 보통 오브젝트의 위치나 종류를 결정할때 사용된다.

 

예를 들어서 장애물이 임의의 위치에 나타나거나

보상아이템이 랜덤하게 나오는 경우이다.

 

하지만 이때에는 무작정 랜덤하게 나오는 것보다 장애물이 특정 위치에 더 자주 나온다던지,

보상아이템중 더 좋은 아이템은 적은 확률로 나온다던지 하고 싶을 경우가 있을것이다.

 

그래서 여기서는 난수를 확률대로 나오게 하는 간단한 나만의 방법을 소개하고자 한다.

 

 

public class Rate {

public int mTable[];

 

//확률 설정

public void set(int rate[]) {

 

int table[] = new int[100];    //각각의 숫자들의 확률을 담을 테이블배열

int value = 0;    //테이블배열에 체울 시작 인덱스

int end = 0;      //테이블배열에 체울 끝 인덱스

 

//매개변수 rate[]에 들어있는 각각의 숫자만큼 테이블배열에 인덱스번호를 체운다

for(int i = 0 ; i < rate.length && end < 100 ; i++) {

if(rate[i] > 0) {  //0일때는 배열을 체우지 않는다 

 

//테이블배열에 체울 끝 인덱스를 계산

end = value + rate[i];

if(end > 100)

end = 100;

 


//테이블배열을 체운다

Arrays.fill(table, value, end, i);

 

//테이블배열에 체울 시작 인덱스를 계산

value+=rate[i];

}

}

 

mTable = table;

}

 

//확률에 따른 난수값

public int getValue() {

return mTable[randomNumber(0, 99)];

}

 

//난수값

private int randomNumber(int start, int end) {

 

Random random = new Random();

int result = 0;

 

if(start > end)

return 0;

else if(start == end)

return start;

 

result = (Math.abs(random.nextInt()) % (end - start + 1)) + start;

 

return result;

}

}

 

//0은 0%, 1은 5%, 2는 10%, 3은 40%, 4는 0%, 5는 0%, 6은 32%, 7은 13% 

확률로 나오도록 한다.

Rate rate = new Rate();

rate.set(

new

 

int[] {05, 10, 40, 0, 0, 32, 13});

 

int value = rate.getValue();

 

 

 

원리는 이렇다.

 

배열에 각각의 확률을 넣는다.

그러면 이 각각의 확률이 해당 인덱스 숫자가 나올 확률이 된다.

 

즉, 위에서처럼 첫번째 인덱스는 0이므로 0은 0%확률로 나오고 

두번째 인덱스는 5이므로 1은 5%확률로  나온다.

 

이는 테이블배열 mTable[]이 {1,1

,1,1,1,2,2,2,2,2,2,2,2,2,2,3,3,3, ... ,7

}로

만들어지고, 0 ~ 99까지의 난수를 발생시켜 해당 인덱스의 숫자를 가져오면 

설정된 확률대로 나오게 되는것이다.

 

즉, 난수가 0 ~ 4 이면 1, 5 ~ 14 이면 2, 15 ~ 54 이면 3, .. 이런식이다.

 

물론 이방법은 큰 숫자를 발생시키기에는 무리가 있다.

큰 숫자까지 고려한 조금 더 복잡한 방법은 여기에서 더 꼬아야 한다.

 

 

 

사업자 정보 표시
주식회사 머리말 | 고영진 | 서울특별시 송파구 중대로 135 서관 10층 (가락동, 아이티벤처타워) | 사업자 등록번호 : 524-88-00727 | TEL : 010-9990-3674 | Mail : gyjmeba@hanmail.net | 통신판매신고번호 : 2017-서울강남-03941호 | 사이버몰의 이용약관 바로가기