PRNG(伪随机数生成器)和种子值
2016-7-11 15:53:7
收藏:0
阅读:113
评论:2
在 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
-- 返回值应该是一个 0 到 1 之间的浮点数
local randomvalue_a = srandom(inputseed)
-- 返回值应该是一个 10 到 20 之间的整数
local randomvalue_b = srandom(inputseed, 10, 20)
我的问题是,当通过这样的 PRNG 运行类似的种子值时,它们会产生类似的结果吗?
我的意思是,数字 3 和数字 5 相比于像 3001 这样的大数字更接近。前两个数字是否可能产生类似的伪随机值?
谢谢。
点赞
用户4687565
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必须交换。
2016-07-10 18:44:10
评论区的留言会收到邮件通知哦~
推荐文章
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
对于大多数伪随机数生成器(PRNGs),类似种子极不可能产生相似的结果,如果你需要多个种子,那相邻的整数是一个理想的选择,因为可以很容易地证明它们都是不同的,并且适当地分配这些种子是 PRNG 设计者的职责(尽管他们可能正在糟糕地执行他们的工作)。
对于那个特定的生成器,你应该直接运行一下算法,看看你得到了什么。如果它正确地工作,你应该看到种子 3 和 5 以同样快的速度分散,就像种子 3 和 3001 一样。