2016-07-10 3 views
0

PRNG는 종자 값 :내가 루아 스크립트에서 다음과 같은 PRNG를 사용하고

inputseed = {763261} 
seedobja = 1103515.245 
seedobjc = 12345 
seedobjm = 4294967.295 --0x100000000 

function srandom(seedobj, fVal1, fVal2) 
    seedobj[1] = mod(seedobj[1] * seedobja + seedobjc, seedobjm) 
    local temp_rand = seedobj[1]/(seedobjm - 1) 
    if (fVal2) then 
     return floor(fVal1 + 0.5 + temp_rand * (fVal2 - fVal1)) 
    elseif (fVal1) then 
     return floor(temp_rand * fVal1) + 1 
    else 
     return temp_rand 
    end 
end 

-- the returned value should be a float between 0 and 1 
local randomvalue_a = srandom(inputseed) 
-- the returned value should be an integer between 10 and 20 
local randomvalue_b = srandom(inputseed, 10, 20) 

이 같은 PRNG를 실행할 때, 유사한 종자 값이 유사한 결과를 않는 내 질문?

숫자 3과 숫자 5는 3001과 같이 큰 숫자에 비해 서로 가깝습니다. 처음 두 숫자는 비슷한 의사 랜덤 값을 생성합니까?

감사합니다.

+0

발전기가 내게 제대로 보이지 않습니다. 정수 LCG를 기반으로하지만 부동 소수점에 맞지 않는 것으로 보입니다. – sh1

답변

1

루아는 질문과 관련이 없습니다.

Remember, Google loves us all.

이 잘 함수 정의의 세 번째 줄에 추가 휘파람 선형 congruental 발전기입니다. 우리가 라인 2와 3에 수식을 보면

, 당신은 실제로 기간 C와 주기적 선형 mod(x,c) 작동도있다 그러나 2 호선에서 x *a + bx/(c-1)가 정확히 속성이 선형 작업이라는 것을 확인할 수 있습니다 . 따라서 선형 주기적입니다. 그것은 몇 가지 점을 제외하면 그 선형입니다.

실제로 알고리즘을 직접 테스트하는 경우. (예 : here), 주어진 매개 변수의 기간은 약 3 또는 4입니다.

3과 3.1과 같은 값인 경우 결과는 비슷하지만 3과 6.87의 결과도 마찬가지입니다.


이 기간 btw는 발전기가 올바르지 않음을 나타냅니다. 발전기 출력을 자체에 공급해야하므로 출력 범위에서 선형이 아니어야합니다 (그 기간은 (0,1) 범위의 출력에 대해 1보다 훨씬 작아야합니다).

이렇게하려면 분모가 mod 함수의 분자보다 낮아야합니다. 귀하의 경우에는 seedobjcseedobjm을 교체해야합니다.

+0

또한 @ sh1이 지적했듯이 발생기가 잘못되어 자체 출력이 공급되면 10 단계까지 단조롭게 특정 값으로 수렴됩니다. – Dimitry

+0

내가해야 할 일을 이해하지 못합니다. (또한 함수의 사용법을 보여주기 위해 예제의 맨 아래에 몇 줄의 코드를 추가했습니다.) – posfan12

+0

이 기능이 더 좋습니까? http://stackoverflow.com/a/18725427/330663 나는 그 주제를 시작한다는 것을 완전히 잊었다. – posfan12

1

대부분의 PRNG에 대해 유사한 종자는 비슷한 결과를 생성 할 가능성이 매우 낮습니다. 여러 종자가 필요한 경우 인접한 정수는 모두 고유하다는 것을 증명하기 쉽고 그 종자를 적절하게 배포하는 것이 쉽지 않기 때문에 이상적인 선택입니다 PRNG 디자이너 (비록 그들이 일을 나쁘게했을 수도 있음).

특정 생성기의 경우 산술을 살펴보고 얻은 결과를 확인해야합니다. 올바르게 작동하면 씨앗 3과 5가 3과 3001만큼 빨리 갈라집니다.

관련 문제