Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Random PRNG和种子值_Random_Lua - Fatal编程技术网

Random 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

我在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 = 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))