2016-12-26 1 views
0

오늘 저는 루아에서 간단한 게임을 썼습니다. 이 게임의 일부는 테이블에서 임의의 요소를 선택하여 인쇄해야합니다. 예 :Lua math.random이 고장 났습니까?

test = { "foo", "bar", "test"} 
print(math.random(#test)) 

문제는 다음과 같습니다. 나는 이렇게 쓰면 항상 1이됩니다. 내가 뭔가를 놓친 다음 REPL에서 작동하는 이유는 무엇입니까?

Screenshot of the code and CMD It works in REPL lua 버전 5.3.2.

BTW : 나쁜 영어로 죄송합니다.

+0

나를 위해 repl에서 작동하지 않습니다. –

+0

또한,'# test'는 값 자체가 아닌 인덱스를 출력합니다. –

+2

모든 언어가 아닌 경우 거의 모든 언어에서 random() 함수를 사용할 때 프로그램 실행마다 다른 결과를 얻으려면 시드 값을 사용해야합니다. math.random()을 호출하기 전에 math.randomseed (os.time())과 같은 것을 사용해야합니다. –

답변

3

난수 생성기를 시드해야합니다.

루아의 math.random() 기능은 C의 rand() 기능에 해당합니다.

C에서 rand() 함수는 초기 시드로 결정된 시퀀스에서 다음 값을 반환합니다. 기본 초기 시드 값은 1입니다. 즉, 프로그램을 실행할 때마다 동일한 시퀀스가 ​​사용됩니다 (재현 가능한 결과가 필요한 경우 유용 할 수 있음).

거의 임의의 결과를 얻으려면 시드를 초기화해야합니다 (예 : 현재 시간 사용).

C에서, 이것은 다음과 같이 행해질 수있다 :

srand(time(NULL)); 
int r = rand(); 

대응 루아 코드이다 os.time() 전형적 초의 정수 값으로 현재 시간을 반환

math.randomseed(os.time()) 
print(math.random()) 

하는 것으로되므로 동일한 초 안에 프로그램을 두 번 실행하면 동일한 시드를 얻게됩니다. 또한 C의 rand() 함수와 따라서 루아의 math.rand() 함수는 일반적으로 고품질의 의사 난수 생성기가 아닙니다. 이 아닌은 암호화와 같이 예측할 수없는 값이 필요한 응용 프로그램에 사용하십시오. (더 나은 PRNG가 있지만이 질문의 범위를 벗어납니다.)

+0

BSD와 Mac OSX에서 한 가지만 두 개의 씨드가 조금씩 다르면 random()의 결과가 동일하다는 문제가 있습니다. 해결 방법은 다음과 같습니다. math.randomseed (tonumber (tostring (os.time()) : reverse() : sub (1,6))) (출처 : http://lua-users.org/wiki/MathLibraryTutorial) –

관련 문제