C#

[C#]난수 생성 방법(Random 클래스)

DevStory 2021. 9. 25.

C#은 난수(랜덤 값)를 생성하기 위해 Random 클래스를 제공합니다.

 

이번 포스팅에서는 Random 클래스의 메서드를 사용하여 난수를 생성하는 방법을 소개합니다.

 


임의의 난수 생성

임의의 난수는 Random 클래스의 Next() 메서드를 사용하여 생성할 수 있습니다.

 

다음 코드는 임의의 난수를 생성하는 코드입니다.

Random randomObj = new Random();

int randomValue = randomObj.Next();

Next() 메서드는 -2,147,483,648 ~ 2,147,483,647 범위 내 양의 정수를 반환합니다.

 

다음은 랜덤 값을 List<int>에 넣는 코드입니다.

Random randomObj = new Random();

List<int> list = new List<int>();

int randomValue;

for(int i = 0; i < 10; i++)
{
    randomValue = randomObj.Next();

    if (!list.Contains(randomValue))
        list.Add(randomValue);
}

실행 결과

임의로 생성된 랜덤 값이 중복될 수 있으므로 List 클래스의 Contains 메서드로 중복 여부를 체크합니다.


범위의 난수 생성

Next() 메서드가 오버로딩된 Next(int) 메서드를 사용하여 지정된 값보다 작은 임의의 정수를 생성할 수 있습니다.

Random randomObj = new Random();

List<int> list = new List<int>();

int randomValue;

for(int i = 0; i < 10; i++)
{
    randomValue = randomObj.Next(20);

    if (!list.Contains(randomValue))
        list.Add(randomValue);
}

실행 결과

Next() 메서드에 20을 전달하여 20보다 작은 양의 난수를 생성합니다.

 

중복되는 난수가 존재해서 List에는 8개의 값이 들어갔습니다.


최소에서 최대 범위의 난수 생성

Next(int min, int max) 메서드를 사용하여 지정된 범위 내에 있는 난수를 가져옵니다.

Random randomObj = new Random();

List<int> list = new List<int>();

int randomValue;

for(int i = 0; i < 10; i++)
{
    randomValue = randomObj.Next(50, 100);

    if (!list.Contains(randomValue))
        list.Add(randomValue);
}

실행 결과

50 ~ 100 사이의 난수를 생성합니다.

 

만약, 최댓값이 최솟값보다 작을 경우 예외가 발생합니다.

반응형

소수점 난수 생성

정수가 아닌 0.0 ~ 1.0 사이의 난수를 생성해야 하는 경우 NextDouble() 메서드를 호출합니다.

Random randomObj = new Random();

List<double> list = new List<double>();

double randomValue;

for(int i = 0; i < 10; i++)
{
    randomValue = randomObj.NextDouble();

    if (!list.Contains(randomValue))
        list.Add(randomValue);
}

실행 결과


랜덤 바이트 생성

난수가 byte 값인 경우 NextBytes() 메서드를 호출합니다.

Random randomObj = new Random();

byte[] byteArray = new byte[10];

randomObj.NextBytes(byteArray);

실행 결과

앞에서 소개한 메서드와는 달리 NextBytes() 메서드는 반환 타입이 void입니다.

 

NextBytes() 메서드에 byte 타입의 배열을 전달하여 배열의 요소를 난수로 채웁니다.


시드 값(Seed value)

컴퓨터는 난수 생성 알고리즘을 사용하여 난수를 사용하는데, 난수 알고리즘을 실행하기 위해 사용되는 값을 시드(Seed)라고 부릅니다.

 

시드 값이 동일한 경우 컴퓨터는 동일한 패턴의 난수를 생성합니다.

Random randomObj1 = new Random(10);
Random randomObj2 = new Random(10);
Random randomObj3 = new Random(10);

List<int> list1 = new List<int>();
List<int> list2 = new List<int>();
List<int> list3 = new List<int>();

for(int i = 0; i < 3; i++)
{
    list1.Add(randomObj1.Next());
    list2.Add(randomObj2.Next());
    list3.Add(randomObj3.Next());
}

실행 결과

위 코드는 randomObj1, randomObj2, randomObj3 인스턴스를 생성할 때, 시드 값 10을 Random 생성자에 전달합니다.

 

시드 값이 동일하기 때문에 동일한 랜덤 값이 생성됩니다.

 

빈 값을 전달하면 시스템 시계를 기준으로 시드 값을 생성합니다.

 

다음 코드는 Random 인스턴스를 생성할 때, 빈 값을 전달합니다.

Random randomObj1 = new Random();
Random randomObj2 = new Random();
Random randomObj3 = new Random();

List<int> list1 = new List<int>();
List<int> list2 = new List<int>();
List<int> list3 = new List<int>();

for(int i = 0; i < 3; i++)
{
    list1.Add(randomObj1.Next());
    list2.Add(randomObj2.Next());
    list3.Add(randomObj3.Next());
}

실행 결과

난수들이 다른 이유는 randomObj1 인스턴스가 생성 후 randomObj2 인스턴스가 생성되기까지 정말 짧은 시간 차이가 존재하기 때문에 시드 값이 다릅니다.

 

시드 값이 다르기 때문에 난수의 값도 다르게 생성되었습니다.

반응형

댓글