Lua Script - 랜덤 math.random()이 항상 1만 나오는 이유

개발/lua script1 2025. 10. 21. 14:58

Lua 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만 나와요?” 문제는 한 번에 해결됩니다.

반응형
admin