Lua Script - 랜덤 math.random()이 항상 1만 나오는 이유
개발/lua script1 2025. 10. 21. 14:58Lua Script(루아 스크립트)로 간단한 난수 테스트를 하다 보면, 이상하게 math.random(1,3) 호출할 때마다 계속 1만 나오는 경우가 있습니다.
분명 math.randomseed(os.time())도 넣었는데 말이죠
왜 이런 걸까요?
1. 기본 구조 다시 보기
Lua에서 난수는 이렇게 사용하죠.
math.randomseed(os.time())
print(math.random(1, 3))
이건 1부터 3 사이의 난수를 만들어주는 코드입니다.
그런데 이걸 여러 번 실행해보면…
1
1
1
1
이렇게 1만 계속 나올 때가 있습니다
2. 원인: os.time()은 초 단위라서!
핵심 이유는 바로 이겁니다.
os.time()이 초 단위라서, 같은 초 안에 실행되면 시드값이 똑같다.
즉, 매번 실행될 때 시드(seed)가 같으면, 난수 생성 결과도 항상 동일한 패턴으로 나옵니다.
그래서 math.randomseed(os.time())를 짧은 간격으로 실행하면, 늘 같은 결과(예: 1)만 나오는 거예요.
3. 해결 방법 1 — 시드는 “한 번만” 설정하기
시드는 프로그램 시작할 때 한 번만 설정하면 됩니다.
-- 프로그램 시작 시 한 번만 실행
math.randomseed(os.time())
for i = 1, 5 do
print(math.random(1, 3))
end
실행 결과 (예시)
3
1
2
2
3
이제야 제 역할을 하죠
시드는 한 번만 설정, 그 이후엔 math.random()만 계속 호출하면 됩니다.
4. 해결 방법 2 — 더 정밀한 시드값 사용하기 (권장)
그래도 여러 번 실행 테스트할 때마다 결과가 달랐으면 좋겠다면, os.time() 대신 밀리초 단위 시드를 써보세요.
math.randomseed(os.time() + os.clock() * 1000000)
print(math.random(1, 3))
os.clock()은 CPU 사용 시간을 소수점으로 반환하기 때문에, os.time()에 더해주면 같은 초 안에서도 시드가 달라집니다.
실행 결과 (예시)
1
3
2
이제 매번 실행해도 결과가 다릅니다
5. 루프 안에서 math.randomseed() 넣으면 안 돼요!
이렇게 작성하면:
for i = 1, 5 do
math.randomseed(os.time())
print(math.random(1, 3))
end
거의 항상 1만 나옵니다.
이건 시드를 루프마다 다시 같은 값으로 초기화하기 때문이에요.
정답은 루프 밖에서 한 번만 설정하는 겁니다.
정리 한마디
Lua의 난수는 “언제 시드를 설정했느냐”가 전부다.
- 시드는 한 번만,
- 가능하면 밀리초 단위로,
- 그리고 이후에는 math.random()만 호출하자!
이 세 가지만 기억하면 “왜 계속 1만 나와요?” 문제는 한 번에 해결됩니다.




