[TIL] 10일 차 - C#의 난수 생성

ChangBeom·2025년 2월 7일

TIL

목록 보기
11/53
post-thumbnail

오늘은 팀프로젝트를 진행하던 도중 정말 난해한 상황이 있어서 TIL에 남겨보려고 한다!

[1. C#의 난수 생성]

C#은 기본적으로 난수를 생성하기 위해 Random 클래스를 제공한다. Random 클래스에는 Next() 함수가 존재하는 데 사용법은 다음과 같다.

Random rand = new Random();

int randomNum = rand.Next();

Console.WriteLine(randomNum);
//	출력 : 842675

이런식으로 사용하면 randomNum 이라는 변수에는 int의 범위 중 양의 정수 범위 내의 랜덤한 값을 반환한다. (0 ~ 2,147,483,647)

그리고 자신이 정한 범위 내에서 랜덤한 값을 반환하고 싶으면 아래와 같이 사용하면 된다.

Random rand = new Random();

int randomNum = rand.Next(1,10);

Console.WriteLine(randomNum);
//	출력 : 4

이런 식으로 사용하면 1부터 9사이 의 랜덤한 값을 반환한다. (1~10이 아닌 점을 주의하자)


그러면 Random.Next()를 사용하면 난수를 생성할 수 있는데 뭐가 난해하지? 라고 생각할 수 있는데

C#의 Random 클래스는 float타입 값의 난수를 생성하는 함수를 제공하지 않는다.

이제부터 원하는 범위 내의 float타입 값의 난수를 생성하는 방법에 대해 알아보자.


[2. Random().NextDouble]

그나마 다행인 점이 C#의 Random 클래스는 NextDouble() 함수를 지원하는데, 이 함수는 0부터 1사이의 double타입 값의 난수를 생성한다.

예를 들면, 아래와 같이 사용할 수 있다.

Random rand = new Random();

int randomNum = rand.NextDouble();

Console.WriteLine(randomNum);
//	출력 : 0.3216547

이런식으로 사용하면 randomNum에는 0부터 1사이의 double타입 값을 반환한다.


그럼 이제 이 함수를 활용해서 내가 원하는 범위 내의 float타입의 난수를 생성해보자


[3. float 타입의 난수 생성]

지금 이 글을 쓰고 있는 이유는 많은 사람들이 나와 같은 부분에서 막혀 구글링을 할 것 같다고 생각하기 때문이다.
왜냐하면 위에서 언급했듯이 C#은 float 타입의 난수를 생성하는 함수를 지원하지 않기 때문이다...

드디어 본론으로 넘어가서 내가 궁금했던 부분은 다음과 같다.

1. C#에서 float타입의 난수를 어떻게 생성하지?
2. 양의 정수 뿐만아니라 음의 정수까지 범위를 늘리고 싶은데 어떻게 하지?

먼저 내가 구현하려고 했던 로직은 다음과 같다.

  • 몬스터를 공격한다.
    • 몬스터의 체력에서 공격력 만큼 깎는다.
      • 공격력은 10%의 오차를 가지게 된다.
        • ex) 공격력이 10이라면 10%인 1만큼 오차가 생겨 9~11의 랜덤한 값이 공격력이 된다.

여기서 만약 공격력이 15라고 가정하면 오차가 -1.5~1.5가 되기 때문에 내가 원하는 음수부터 양수까지 범위의 랜덤한 float타입의 수를 반환하는 로직이 필요했던 것이다.

결론부터 말하면 Random.NextDouble() 함수를 활용하여 내가 원하는 범위의 랜덤한 float값을 반환하는 함수를 직접 만들어야한다.

코드는 다음과 같다.

float GetRandomFloat(double min, double max)
{
	Random rand = new Random();
    return (float)(rand.NextDouble()) * (max - min) + min);
}

이 코드에 대해 예를 들어 설명하면

min = -0.8f, max = 0.5f 라고 가정해보자.

-0.8부터 0.5사이의 범위는 0.5 - (-0.8)인 1.3이다.

여기서 극단적으로 rand.NextDouble()의 최소값인 0이 나왔다고 가정하면, 0 * 1.3 + (-0.8)이 되므로 -0.8이 리턴된다.

반대로 rand.NextDouble()의 최대값인 1이 나왔다고 가정하면, 1 * 1.3 + (-0.8)가 되므로 0.5가 리턴된다.

정리하자면, 내가 원하는 범위 내에서 랜덤한 변수를 반환하려고 하는데, rand.NextDouble()로 생성한 값에 비례하게 반환하겠다는 뜻이다.

0개의 댓글