오늘 저는 루아에서 간단한 게임을 썼습니다. 이 게임의 일부는 테이블에서 임의의 요소를 선택하여 인쇄해야합니다. 예 :Lua math.random이 고장 났습니까?
test = { "foo", "bar", "test"}
print(math.random(#test))
문제는 다음과 같습니다. 나는 이렇게 쓰면 항상 1이됩니다. 내가 뭔가를 놓친 다음 REPL에서 작동하는 이유는 무엇입니까?
BTW : 나쁜 영어로 죄송합니다.
오늘 저는 루아에서 간단한 게임을 썼습니다. 이 게임의 일부는 테이블에서 임의의 요소를 선택하여 인쇄해야합니다. 예 :Lua math.random이 고장 났습니까?
test = { "foo", "bar", "test"}
print(math.random(#test))
문제는 다음과 같습니다. 나는 이렇게 쓰면 항상 1이됩니다. 내가 뭔가를 놓친 다음 REPL에서 작동하는 이유는 무엇입니까?
BTW : 나쁜 영어로 죄송합니다.
난수 생성기를 시드해야합니다.
루아의 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가 있지만이 질문의 범위를 벗어납니다.)
BSD와 Mac OSX에서 한 가지만 두 개의 씨드가 조금씩 다르면 random()의 결과가 동일하다는 문제가 있습니다. 해결 방법은 다음과 같습니다. math.randomseed (tonumber (tostring (os.time()) : reverse() : sub (1,6))) (출처 : http://lua-users.org/wiki/MathLibraryTutorial) –
나를 위해 repl에서 작동하지 않습니다. –
또한,'# test'는 값 자체가 아닌 인덱스를 출력합니다. –
모든 언어가 아닌 경우 거의 모든 언어에서 random() 함수를 사용할 때 프로그램 실행마다 다른 결과를 얻으려면 시드 값을 사용해야합니다. math.random()을 호출하기 전에 math.randomseed (os.time())과 같은 것을 사용해야합니다. –