Random
일반적으로 확률이나 난수를 생성할 때 쓰는 기능이 Random 이다.
Random 변수명 = new Random(); 으로 선언하여 사용하며 변수명.Next()로가 자주 쓰인다.
예를들어, 변수명.Next(0, 5) 라고 한다면 0부터 5까지 즉, "0, 1, 2 ,3, 4" 중에서 랜덤하게 값이 나온다.
하지만 특정 값을 제외하고 난수를 생성해야만 하는 때가 올것이다.
나같은 경우엔 몬스터가 여러마리 있을 때 랜덤한 두 마리를 공격해야 하는 기능이 제시됐는데
몬스터가 죽어버린다면 난수를 돌릴 때 죽은 몬스터 인덱스는 제외해야한다.
하지만 위에 기능대로 사용한다면 불가능하다. 그래서 나는 구글링을 하여 방법을 알아냈다.
var deadExclude = new HashSet<int>(); // 죽은 몬스터들의 인덱스를 저장할 해쉬 셋
var range = Enumerable.Range(0, dp.monsterlist.Count).Where(i => !deadExclude.Contains(i)); //LINQ를 이용하여 해쉬
셋에 저장된 죽은 몬스터의 인덱스 값을 제외하는 조건 적용
Enumerable.Range 란? -> 연속된 데이터를 저장하는 것
Enumerable.Range(0, dp.monsterlist.Count) -> 이 부분은 0부터 몬스터의 갯수 까지 순서대로 채운다. 즉, 0, 3이라고 가정하면 "0, 1, 2, 3" 이 채워진다.
var monRand = new System.Random(); // Random 선언
int index = monRand.Next(0, (dp.monsterlist.Count) - deadExclude.Count); // 0부터 몬스터 갯수 - 죽은 몬스터 갯수 중에서 랜덤한 값 생성
range.ElemantAt 란?
지정된 인덱스의 요소를 반환하는 기능
int monVal = range.ElementAt(index); // 내가 지정한 range 목록(범위)안에서 요소를 반환
이러한 방식으로 특정 값을 제외한 난수 생성을 구현할 수 있다.
'TIL > C#' 카테고리의 다른 글
C# List 와 Array (0) | 2023.08.31 |
---|---|
C# Dictionary (0) | 2023.08.30 |
C# 나눗셈을 소수까지 나타내기 (0) | 2023.08.28 |
C# 문자열의 다양한 변환 (0) | 2023.08.25 |
C# LINQ (0) | 2023.08.24 |