Random PRNG和种子值
我在Lua脚本中使用以下PRNG:Random PRNG和种子值,random,lua,Random,Lua,我在Lua脚本中使用以下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 = seedob
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中运行时会产生类似的结果吗
我的意思是,与3001这样的大数字相比,数字3和5彼此非常接近。前两个数字是否可能产生类似的伪随机值
谢谢。对于大多数PRNG,相似的种子极不可能产生相似的结果,如果您确实需要多个种子,那么相邻的整数是一个理想的选择,因为很容易证明它们都是不同的,适当地分配这些种子是PRNG设计师的责任(尽管他们的工作可能做得不好)
对于那个特定的生成器,您可能只需要遍历一下算术,看看您得到了什么。如果它工作正常,您应该看到种子3和5的发散速度与3和3001一样快。对于大多数PRNG来说,类似的种子极不可能产生类似的结果,如果您确实需要多个种子,则相邻的整数是相同的一个理想的选择,因为很容易证明它们都是不同的,并且适当地分配这些种子是PRNG设计师的责任(尽管他们可能做得不好)
对于那个特定的生成器,您可能只需要遍历一下算术,看看您得到了什么。如果它工作正常,您应该看到种子3和种子5的发散速度与种子3和3001的发散速度一样快。Lua与问题无关 这是线性同余生成器,在函数定义的第三行有额外的哨音 如果我们看第2行和第3行的公式,你会发现
x*a+b
和x/(c-1)
是线性运算,它们完全符合你的属性,但是在第2行还有mod(x,c)
运算,它实际上与周期c呈周期性线性。
所以,它是线性周期的,除了几个点,它是线性的
如果你真的对算法进行了一个简单的测试(例如),你会发现给定的参数周期大约是3或4
也就是说,对于3和3.1这样的值,结果非常接近,但对于3和6.87也是如此
顺便说一句,这个高周期表示您的生成器不正确。因为您应该将生成器输出馈送到自身,所以您希望它在输出范围内不是线性的(对于(0,1)范围内的输出,其周期必须明显小于1)
要做到这一点,mod函数中的分母必须低于分子。在您的例子中,必须交换
seedobjc
和seedobjm
。Lua与问题无关
这是线性同余生成器,在函数定义的第三行有额外的哨音
如果我们看第2行和第3行的公式,你会发现x*a+b
和x/(c-1)
是线性运算,它们完全符合你的属性,但是在第2行还有mod(x,c)
运算,它实际上与周期c呈周期性线性。
所以,它是线性周期的,除了几个点,它是线性的
如果你真的对算法进行了一个简单的测试(例如),你会发现给定的参数周期大约是3或4
也就是说,对于3和3.1这样的值,结果非常接近,但对于3和6.87也是如此
顺便说一句,这个高周期表示您的生成器不正确。因为您应该将生成器输出馈送到自身,所以您希望它在输出范围内不是线性的(对于(0,1)范围内的输出,其周期必须明显小于1)
要做到这一点,mod函数中的分母必须低于分子。在您的例子中,必须交换
seedobjc
和seedobjm
。该生成器在我看来不正确。它似乎基于整数LCG,但不正确地适应浮点。该生成器在我看来不正确。它似乎是b基于整数LCG,但不正确地适应浮点。此外,正如@sh1所指出的,生成器是不正确的,如果输入自己的输出,它会在第十步单调地收敛到一个特定值。我不明白我需要做什么。(此外,我在示例底部添加了几行代码,以显示我如何使用该函数。)这个函数更好吗?我完全忘了我开始了那个主题。很抱歉,我迟了回答。正如我说的,你需要交换seedobjc
和seedobjm
的值,这样seedobjc=4294967.295
和seedobjm=12345
。如果--10和20之间的整数包含10和20,我会说相应的行应该是返回层(fVal1-0.5+temp_rand*(fVal2+1-fVal1))
此外,正如@sh1所指出的,发电机是不正确的,如果给自己的输出供电,它会在第十步单调收敛到特定值。我不明白我需要做什么。(另外,我在示例的底部添加了几行代码,以说明如何使用该函数。)这个函数更好吗?我完全忘了我开始了那个主题。很抱歉,我迟了回答。正如我说的,你需要交换seedobjc
和seedobjm
的值,这样seedobjc=4294967.295
和seedobjm=12345
。如果--10和20之间的整数包含10和20,我会说相应的行应为返回层(fVal1-0.5+温度等级*(fVal2+1-fVal1))