2016-07-10 7 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) 

私の質問は、同様のシード値は、同様の結果を生むんですか?

つまり、数字3と数字5は、3001のような大きな数字に比べて近くにあります。最初の2つの数字は、同様の疑似乱数値を生成する可能性がありますか?

ありがとうございました。

+0

その発電機は私には見えません。それは整数LCGに基づいているようですが、浮動小数点に間違って適合しています。 – sh1

答えて

1

ルアは質問には関係ありません。

Remember, Google loves us all.

これはよくあなたの関数定義の3行目では、追加の笛を持つ線形congruental発電機、です。

私たちはライン2と3に数式を見れば、あなたはx *a + bx/(c-1)が正確にあなたの財産を持って線形演算であることがわかります、しかし、2行目で実際に期間cと定期的に線形であるmod(x,c)動作もあります。 それは線形に周期的です。それはいくつかの点を除いて、線形です。

アルゴリズムの実際のテストを実際に行った場合。 (例: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のようにすぐに分岐することがわかります。

関連する問題