초보분들 Rnd 사용법과 Randomize의 기능에 대해서 잘 모르시는거 같아 설명드립니다.
Rnd 는 0 부터 1 사이의 숫자를 랜덤하게 발생시키는 겁니다.
하지만 0과 1은 나오지 않습니다.
즉 Rnd를 하면 0.087987249864986426757592 ... 뭐 이런식으로 나옵니다.
이것을 가지고 정수를 어떻게 구하느냐!!!
위 숫자에 100을 곱하면 8.7987249864986426757592... 이 되겠죠.
그 다음 소수 이하를 잘라버리는겁니다. 그러면 8 이 되겠죠.
따라서
A = int(Rnd * 100)
하면
A 는 0~99 까지의 숫자를 가지게 됩니다.
왜냐하면 0.001 이하의 숫자가 나오면 100을 곱해도 0.1 이하의 수가 되기때문에 int를 하면 값은 0이 됩니다.
또 0.9999999999... 가 발생한경우 100을 곱하면 99.99999... 즉 1이 안되는 숫자가 되기때문에 int를 하면 99가 나옵니다.
따라서 이런 공식이 나옵니다.
int(Rnd * 숫자) = 0 ~ (숫자-1) 범위의 난수
자! 그런데 나는 0부터가 아닌 1부터 100까지를 구하고 싶은겁니다.
그럼 어떻게 하면 되겠습니까?
맞습니다. 위 공식에 1을 더해주면 되겠죠.
A = int(Rnd * 100) + 1
이렇게 하면 1부터 100까지의 숫자를 구할수 있게 됩니다.
이게 Rnd 사용법의 표준입니다.
근데 이 난수를 계속 발생시키다 보면 웃긴 공식을 발견하게 됩니다.
만약 프로그램을 시작해서 1 부터 100 사이의 난수 5 개를 For 문을 이용해 발생시켰다고 합시다.
(빈 폼에 버튼 한개를 올리고 코딩을 붙여넣기 하세요.)
Private Sub Command1_Click()
dim i as integer
dim a as integer
For i=1 to 5
a = int(Rnd * 100) + 1
Debug.print a
Next
End Sub
결과가 직접실행창에
42, 85, 19, 9, 33
이렇게 만들어져 나왔습니다.
다음 프로그램을 종료하고 다시 실행합니다.
다시 위 명령을 실행하면 결과가 똑같이 나올겁니다.
분명 난수 발생기인데도 불구하고 계속 똑같은 수가 발생합니다.
이것은 왜 그러냐?
정확히는 모르지만 난수는 시계의 SEED 값을 가지고 난수를 만들어 내는데
그값이 컴퓨터마다는 틀리지만 시작은 일정하다고 보시면 됩니다.
그러면 이게 무슨 랜덤이냐!
랜덤이 아니고 정해진 숫자죠.
그래서 있는것이 Randomize 입니다.
Randomize를 해주면 시작값을 바꿔주기 때문에 랜덤한 숫자를 얻을수 있는것입니다.
그래서 Randomize는 For 문이나 Rnd 함수를 쓸때마다 써줄필요는 없고
Form_Load 같은 처음 시작시 한번만 넣어주면
프로그램 내내 다른 숫자를 발생시켜 사용할 수 있습니다.
참고하세요.
첫댓글 Debug.print a 는 뭐죠. 디버그 앞에 붙이니까 화면에 안뜨는데요. 디버그 빼야지 뜨고
Debug.Print a 라고 하는것은 Debug(직접실행창)에 a 값을 표시하겠다는 말입니다. 직접실행창을 메뉴에서 찾아보세요.
Randomize라고 썼는데 에러가;;