게임을 만들다 보면 랜덤으로 숫자를 추출해야하는 경우가 많습니다.
그런데 어떤 경우에는 일정한 범위내에서 중복없이 여러개의 숫자를 추출해야할 때가 있습니다.
예를 들어 1부터 10까지 중에서 1개의 랜덤한 숫자를 추출하는 것은 쉬운 함수 한줄이면 가능합니다.
int num = Random.Range(1, 10);
하지만 로또와 같이 1부터 45까지 번호중에서 6개를 중복 없이 추출해내는 것은 좀 더 복잡한 코딩을 해아합니다.
public static int[] RandomCreate(int count, int RangeMin, int RangeMax)
{
int[] nums = new int[count];
//1. 매게변수에서 받은 count 개수와 같은 범위를 가진 배열을 만듭니다.
List<int> rangenums = new List<int>();
// 2. 그리고 또 다른 리스트를 하나 만듭니다.
for (int i = 0; i < RangeMax-RangeMin; i++)
{
rangenums.Add(i+RangeMin);// rangenums[0] = 0+RangeMin 이라는 숫자가 들어갑니다.
}
//3. 위에서 만든 리스트에 RangeMin부터 RangeMax까지의 정수를 추가합니다.
for (int i=0; i<count;i++)
{
int RandomNum = Random.Range(0, rangenums.Count);
// 4.RandomNum 변수에 지정한 범위 내에서 랜덤한 수를 하나 추출합니다.
nums[i] = rangenums[RandomNum-RangeMin];
// 5. 그리고 rangenums리스트의 추출된 수에서 범위의 최소값을 뺀 순번째의 수를 처음 만든 배열 nums에 추가합니다.
rangenums.RemoveAt(RandomNum-RangeMin);
// 6. 그리고 한번 들어간 수는 rangenums 리스트에서 제거 됩니다. 그러므로 한번 나온 수가 추출되는 일은 없어집니다.
}
// 7.그렇게 난수 추출 개수 만큼 nums[] 배열에 담아줍니다.
return nums; // 8.nums 라는 배열을 반환합니다.
}
'정수의 배열'로 반환하는 함수(난수추출개수, 최소범위, 최대범위)
1. 매게변수에서 받은 count 개수와 같은 범위를 가진 배열을 만듭니다.(nums라는 배열의 개수를 정해 생성합니다.)
2. 그리고 또 다른 리스트를 하나 만듭니다.
3. 2번에서 만든 리스트에 RangeMin부터 RangeMax까지의 정수를 추가합니다. 그럼 리스트에는 범위 내의 숫자가 순서대로 삽입됩니다. 예) RangeMin = 5, RangeMax = 20 라면 rangenums[0] =5, rangenums[1] =6 ........ rangenums[15] = 20이렇게 됩니다.
4. RandomNum 변수에 0부터 rangenums의 count만큼의 범위서 난수를 추출합니다.
5. 그리고 rangenums리스트의 추출된 수에서 범위의 최소값을 뺀 순번째의 수를 처음 만든 배열 nums에 추가합니다. 여기가 중요합니다. nums 에 넣어주는 숫자가 RandomNum 를 그대로 넣어주는 것이 아니라 rangenums리스트에 담겨져 있는 숫자를 넣는 것이 중요합니다. 예) RandomNum = 7 이라면 rangenums[RandomNum-RangeMin]는 rangenums[7-5] 즉, rangenums[2]에 담겨져 있는 수가 됩니다. rangenums[2]에는 7에 담겨져 있습니다.
6. 그리고 한번 들어간 수는 rangenums 리스트에서 제거 됩니다. 그러므로 한번 나온 수가 추출되는 일은 없어집니다.
예) 만일 RandomNum = 7 라면 rangenums[2]에 담겨진 7이 nums[0] 에 들어갑니다. 그리고 rangenums[2]는 제거됩니다.
그럼 rangenums[2] 에는 8이 담기게 됩니다. 그렇게 된다면 다음번에 RandomNum = 7이 동일하게 나오더라도 rangenums[RandomNum-RangeMin]는 rangenums[2]에는 8가 담겨 있기 때문에 중복해서 숫자를 추출하는 일은 없게 되는 겁니다.
7. 난수 추출 개수 만큼 반복문을 반복 실행해 nums[] 배열에 담아줍니다.
8. nums 라는 배열을 반환합니다.
static으로 선언 했기 때문에 다른 스크립트에서도 원하는 개수만큼의 중복되지 않은 난수의 배열을 한줄로 얻을 수 있습니다.
예) int[] num = 클래스명. RandomCreate(6, 1, 45);
이런 식으로 말이죠. 그럼 로또 번호와 같이 1부터 45까지 중에서 6개의 중복없는 난수를 num배열에 차례로 추출할 수 있게 됩니다.
'유니티 기초 스킬' 카테고리의 다른 글
| Null Reference Exception를 줄일 수 있는 연산자들(?. , ?[], ??, ??=) (0) | 2024.05.01 |
|---|---|
| ? 조건연산자(삼항연산자) (2) | 2024.05.01 |
| TextMeshPro(텍스트 메시 프로) 한글폰트 추가 방법 (0) | 2024.04.24 |