如何跟踪 Lua 中的随机数种子
2016-3-3 11:32:36
收藏:0
阅读:94
评论:2
在 Lua 中,通常使用 math.randomseed 生成随机数种子,但是显然 math.random 也会设置种子(重复调用不返回相同结果),它设置的值是什么,怎样跟踪它,如果不能跟踪,请解释为什么。
点赞
用户936986
这不是关于 Lua 的问题,而是有关一些随机数生成算法的一般性问题。
首先,Lua 没有自己的随机数生成器(RNG)- 它们只输出来自底层 C 库的 RNG(略带改变的)值。大多数 RNG 实现不会向您透露它们的内部状态,但有时您可以自己计算出来。
例如,当您在 Windows 上使用 Lua 时,您将使用来自 MS C 库的基于 LCG 的 RNG。您得到的数字是种子的一部分,而不是完整的值。有两种方法可以处理:
- 如果您知道调用
random的次数,您可以取初始种子值,将其提供给使用与 MS 库中硬编码的相同常量的相同算法的副本,然后获取种子的准确值。 - 如果您不知道调用两次
random之间是否有其他干扰,您可以获取两个生成的数字,并通过将位移回其位置反转 LCG 算法。这将使您遗留下几个缺失的位(还有一个由于 Lua 操纵而多出来的位),您需要简单地进行暴力破解 - 重复所有缺失位,直到您的算法的副本产生之前记录的完全相同的两个“随机”数。这将是存储在库的 RNG 中的当前种子。在稍微过时的 PC 上,在 Lua 中编写良好的解决方案可以在大约 0.2-0.5s 内进行暴力破解,我过去曾这样做过。这是 Crypto.SE 上关于这个任务的更详细的示例:Predicting values from a Linear Congruential Generator。
第一种方法可用于任何不使用任何真正熵源的其他 RNG 算法,第二种方法可用于大多数不掩盖太多切片位以使暴力破解不合理的 RNG。
真正的答案是:您根本不需要跟踪种子。您想要的可能是其他东西。
2016-03-03 14:53:24
评论区的留言会收到邮件通知哦~
推荐文章
- 如何将两个不同的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中获取用户配置主目录的跨平台方法
如果添加种子,所有
math.random()生成的数字都是伪随机的(这总是如此,因为系统会自动生成种子)。math.randomseed(4) print(math.random()) print(math.random()) math.randomseed(4) print(math.random())结果如下:
因此,如果您将种子重置为相同的值,则可以预测将出现的所有值,直到已使用该种子生成的最大连续值。
种子不执行的操作是使
math.random()的输出保持不变。如果您将它重复设置为相同的值,则它将是相同的。一个类比作为示例
假设随机数是 0 到 9 之间的整数(而不是 0 到 1 之间的双精度数)。
math.random()可以从任意起始位置遍历 $\pi$ 的小数部分(默认可能是系统时间)。使用
set.seed()时所做的是(不是字面意思,如前所述)设置要检索数字的 $\pi$ 小数部分的起始位置。如果您现在将种子重置为相同的起始位置,则数字将与您上次重置起始位置时相同。
您将知道最后一次调用的数字,之后您就不能再确定了。