TIL/C#

C# 특정 값 제외 난수 생성

Sh_Blog 2023. 8. 29. 20:33

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 목록(범위)안에서 요소를 반환

 

이러한 방식으로 특정 값을 제외한 난수 생성을 구현할 수 있다.