반응형
중복되지 않은 난수 배열 필요
랜덤으로 난수를 생성하되, 중복되지 않게 생성하고 싶은 경우가 생겨서 작성하게되었습니다. 아래의 스크립트를 통해 난수 배열을 가져올 수 있습니다.
스크립트
/// <summary>
/// 중복되지 않는 랜덤 숫자 리스트 만들기 (minValue: 0)
/// </summary>
/// <param name="maxValue">최대값(제외)</param>
/// <param name="count">반환 개수</param>
/// <param name="isDuplicate">중복 숫자 여부</param>
/// <param name="randomSeed">랜덤 씨드</param>
/// <returns></returns>
public static int[] MakeRandomNumbers(int maxValue, int randomSeed = 0)
{
return MakeRandomNumbers(0, maxValue, randomSeed);
}
/// <summary>
/// 중복되지 않는 랜덤 숫자 리스트 만들기
/// </summary>
/// <param name="minValue">최소값(포함)</param>
/// <param name="maxValue">최대값(제외)</param>
/// <param name="count">반환 개수</param>
/// <param name="isDuplicate">중복 숫자 여부</param>
/// <param name="randomSeed">랜덤 씨드</param>
/// <returns></returns>
public static int[] MakeRandomNumbers(int minValue, int maxValue, int randomSeed = 0)
{
if (randomSeed == 0)
randomSeed = (int)DateTime.Now.Ticks;
List<int> values = new List<int>();
for (int v = minValue; v < maxValue; v++)
{
values.Add(v);
}
int[] result = new int[maxValue - minValue];
System.Random random = new System.Random(Seed: randomSeed);
int i = 0;
while (values.Count > 0)
{
int randomValue = values[random.Next(0, values.Count)];
result[i++] = randomValue;
if (!values.Remove(randomValue))
{
// Exception
break;
}
}
return result;
}
예제
private static void Main(params string[] args)
{
// 0 ~ 10 랜덤 난수 배열 만들기
int[] randomNumbers = Utils.MakeRandomNumbers(10);
for (int i = 0; i < randomNumbers.Length; i++)
{
Console.WriteLine(randomNumbers[i]);
}
// Result
// 9
// 5
// 4
// 2
// 8
// ..
}
마무리
매개변수로 중복을 허용할 수도 있으며, 랜덤 시드를 설정하여 랜덤을 고정할 수 있습니다.
필요한 경우 유용하게 사용하시길 바랍니다. :)
반응형
'Utils' 카테고리의 다른 글
Unity, 현재 입력된 KeyCode 가져오기 (0) | 2022.12.28 |
---|---|
C#, List 랜덤으로 섞기 확장함수 (Shuffle) (1) | 2022.10.24 |
C#, 데이터 리스트를 CSV파일로 생성하기 (0) | 2022.07.23 |
C# Windowform, 유니티처럼 코루틴 만들어서 사용하기 (2) | 2022.07.17 |
C#, 64비트 초과 비트연산자용 구조체 ShiftComparer (0) | 2022.07.04 |
댓글