루아 질문입니다.

542 views
Skip to first unread message

yakira

unread,
Jan 10, 2007, 7:02:48 AM1/10/07
to luausers-kr
루아 공부를 하다가, 이상한게 있는데 물어볼만한
곳이 없네요.
랜덤 숫자를 발생시키기위해 math.randome()함수를
사용했는데요.
랜덤시드를 시스템시간으로 넣어서 초기화를
했는데도, 첫번째 발생하는 숫자는 항상 같은 숫자가
나옵니다. 제가 알기로는 시드숫자는 난수표에서
인덱스 역할을 하기 때문에 시드가 다른데도 계속
같은 수가 나올 확률은 적다고 생각되는데요. 그리고
만약 시드의 입력이 잘못된거라면 계속해서 같은
숫자가 나와야 하는데, 첫번째가 아닌 두번째 뽑는
숫자는 항상 다르게 나옵니다.
루아코드를 다름과 같이 짜보았는데요,
=======

My_Seed = os.date("%d%H%M%S")

math.randomseed(os.date(My_Seed))
print(My_Seed)
print(math.random(1,9))
print(math.random(1,9))
print(math.random(1,9))
print(math.random(1,9))

=========
이것을 여러번 실행했을때, 결과는 My_Seed가 계속
변하는데도, 첫번째 뽑히는 숫자는 항상 일정합니다.
이후의 2,3,4번때 숫자는 항상 변하구요.
저는 메모장에서 루아파일을 작성하고, 루아콘솔에서
dofile하는 방식으로 공부중입니다.
이에 대해 답변 부탁드립니다.

redpixel

unread,
Jan 11, 2007, 4:19:43 AM1/11/07
to luaus...@googlegroups.com
아마도 시드값을 줄때 날짜를 지정해서 그런가 봅니다. 가능한한 값이 잘 변하는 값을 주어야하죠. 루아 버그가 아닌 사용상의 잘못인 것 같네요.
 
math.randomseed(os.time())
 
이렇게 넣고 해보세요. :)
 
- redpixel

 
07. 1. 10일에 yakira <ino...@gmail.com>이(가) 작성:

yakira

unread,
Jan 11, 2007, 11:55:59 AM1/11/07
to luausers-kr
답변 감사합니다. 하지만 그래도 결과는
마찬가지네요.

오늘 몇가지 테스트를 해보았습니다.

1) 1~9까지의 숫자를 뽑을때, 시드값을 1,2,3,4로 주니까
모두 첫번째 수가 1만 나왔습니다.
2) 같은 시드값으로 math.random()에 인수를 넣지 않고
뽑아보니, 첫번째 숫자가 0.00125... , 0.00137... , 0.00146...,
0.00155.... 로 나오더군요. 아마도 이 소수에서 최초에
출현하는 1이 계속 나온것 같았습니다.
3) 그래서, 같은 시드값으로 0~9까지의 수를 뽑아보니,
역시 모두 0이 나오더군요.
4)시드값을 1000,2000,3000,4000을 각각 주고 1~9까지
랜덤수를 뽑아보니, 첫번째 수는 각각 1,2,3,4 가
나왔습니다.

루아에서 시드값을 격차가 큰 랜덤한 수로 지정할수
없는한 시드값 지정후에 최초로 나오는 수는
랜덤수로서 신뢰하지 않는 편이 좋을것 같습니다.
물론, 최초에 한번만 시드값을 지정하면
관계없습니다.

사용상의 잘못이든, 루아의 버그이든 생각하기
나름일것 같구요. 디버깅시에 참고하면 좋을듯
합니다. 정말 난수로 보이는 수를 뽑고 싶다면,
시드값을 지정한 후에는 꼭 math.random()을 실행해서,
첫번째 뽑히는 수를 버리는 것도 괜찮을것 같습니다.

류광

unread,
Jan 12, 2007, 4:27:00 AM1/12/07
to luausers-kr

math.random()과 math.randomseed()는 표준 C 라이브러리의
rand(), srand()를 그대로 사용하므로(src/lmathlib.c 참고) 그
두 함수의 한계를 그대로 이어 받습니다. rand(),
srand()의 구체적인 구현 방식은 컴파일러마다
다르겠지만, 대체로 간단한(그리고 품질에 한계가
있는) "선형합동" 알고리즘을 사용하는 것으로 알려져
있습니다.

빠르면서도 품질 좋은 난수를 만들어 내는 것으로
알려진 난수 발생 알고리즘으로는 메르센-트위스터
알고리즘을 들 수 있는데, 이를 구현한 루아 모듈이
있습니다: http://www.tecgraf.puc-rio.br/~lhf/ftp/lua/#lrandom

Reply all
Reply to author
Forward
0 new messages