VB.NET Rnd, Randomize, Random 랜덤값 난수 사용하기

2024. 2. 20. 14:22VB.NET/왕초보

랜덤값은 의외로 여러 분야에서 많이 사용하게 되는 기능이니 이번 기회에 확실히 알아보도록 하자.

 

예전 VB98에서 랜덤값을 사용하려면 Rnd 함수를 사용해야 했고, 지금도 이 방법이 익숙해서 많이 사용된다. 사용법은 아래와 같다.

 

Rnd() 함수는 0 이상,  1 미만의 임의의 부동 소수점 숫자를 반환한다. 1 미만이기 때문에 1은 반환하지 않는다는 것에 주의하자. 0은 반환하기도 하지만, 확률적으로 아주 낮다. 아래 예제를 살펴보자.

Dim rndVal = Int(Rnd() * 10) + 5

 

이렇게 하면, rndVal에는 5 이상, 15 미만의 랜덤값이 들어가게 된다. 랜덤값은 말 그대로 임의의 값이기 때문에 어떤 값이 들어갈지는 며느리도 모른다. 다만 범위만 정해줄 뿐이다.

 

그러면 Randomize()라는 함수는 도대체 어디에 쓰는걸까?

 

여기서 Rnd() 함수의 특징을 살펴볼 필요가 있다. Rnd() 함수는 특정 시드값을 기준으로 난수를 발생시키는데, 이 시드값은 PC별로 동일한 값이라고 생각된다. (정확치는 않다.) 일부에서는 시스템 시간을 이용한다고 하는데 아래 결과를 보면 그렇지는 않은듯 보인다.

Dim rndVal As Integer

For i As Integer = 0 To 10
    rndVal = Int(Rnd() * 10) + 5
    Debug.Print($"랜덤 발생한 난수 = {rndVal}")
Next

 

결과를 확인하면 아래와 같다. 이 결과는 필자의 PC에서 나오는 결과이며, 여러분의 PC에서는 다른 결과가 나올 것이다.

랜덤 발생한 난수 = 12
랜덤 발생한 난수 = 10
랜덤 발생한 난수 = 10
랜덤 발생한 난수 = 7
랜덤 발생한 난수 = 8
랜덤 발생한 난수 = 12
랜덤 발생한 난수 = 5
랜덤 발생한 난수 = 12
랜덤 발생한 난수 = 13
랜덤 발생한 난수 = 12
랜덤 발생한 난수 = 5

 

별 이상 없이 원하는 난수가 발생해서 5 이상, 15 미만의 랜덤값이 들어갔다. 그렇다면, 이 시점에 Randomize()에 대해 의문이 들게 된다. 난수가 잘 발생하는데 Randomize()는 도대체 무엇일까? 이 의문을 해결하기 위해 프로그램 종료 후 다시 실행후 결과를 확인하자.

 

두둥~!

 

위와 동일한 결과가 나오게 된다. 동일 PC에서는 몇번을 실행하든, 항상 동일한 결과가 나온다. 나는 랜덤한 난수가 필요한데, 이들 난수의 순서가 모두 동일한 순서로 발생하니, 결국 난수가 아닌게 되는 것이다. 바로 이 경우에 사용하는 함수가 Randomize()이다.

 

즉, Randomize() 함수는 난수를 발생시킬 때 사용하는 시드값을 변경해주는 함수인 것이다. 이 함수는 매번 실행할 필요는 없고, 프로그램 실행시 1회 (Form_Load 이벤트 등) 만 실행해주면 된다.

 

자... 이제 Random() 클래스에 대해 알아보자. VB.NET에서는 난수를 좀더 손쉽게 발생시키기 위해 Random() 클래스가 추가됐다. 사용법은 아래와 같다. 위의 Rnd() 처럼 5 이상, 15 미만의 랜덤값을 반환하려면 아래와 같이 사용하면 된다.

Dim Rand As New Random()
Dim rndVal As Integer = Rand.Next(5, 15)

 

여기서는 클래스 내부적으로 시드값을 변경해주기 때문에 별도로 Randomize()를 사용할 필요는 없다.

마치며...

난수는 잘 사용하면 유용하지만, 정확한 사용법을 모르고 사용하다가는 의도치 않은 오류를 발생시킬 수도 있으니 정확한 의미를 알고 제대로 사용하도록 하자.

반응형