从lua获取当前随机种子
2017-6-8 15:7:36
收藏:0
阅读:144
评论:1
我知道你可以用 math.randomseed() 来设置 lua 的随机数生成器的种子。
我想要生成两个不同的确定性序列的数字,有点像并行的。我已经将问题简化为以下这个样子:
-- 假设seed1和seed2存在并且是正整数。
local sequence1 = {};
local sequence2 = {};
math.randomseed(seed1);
for i = 1,50 do
sequence1[#sequence1 + 1] = math.random();
end
seed1 = math.getseed(); -- 这就是我想要的函数。
-- 物品
math.randomseed(seed2);
for i = 1,75 do
sequence2[#sequence2 + 1] = math.random();
end
seed2 = math.getseed(); -- 这就是我想要的函数。
-- 物品
math.randomseed(seed1);
for i = 1,50 do
sequence1[#sequence1 + 1] = math.random();
end
seed1 = math.getseed(); -- 这就是我想要的函数。
我已经查看了文档,并将 math 表格放入了一个 k,v in pairs 循环中,但没有找到任何结果。
在 lua 中是否存在这样的函数,或者我必须为此编写自己的生成器?
点赞
评论区的留言会收到邮件通知哦~
推荐文章
- Lua 虚拟机加密load(string.dump(function)) 后执行失败问题如何解决
- 我想创建一个 Nginx 规则,禁止访问
- 如何将两个不同的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 代码?

目前标准的Lua库中没有获取当前种子的函数。您需要做以下操作之一:
自己编写RNG函数(困难)
更改C语言编写的
math.randomseed函数(有风险)使用具有此功能的RNG库(简单)
将
math.random调用的次数保存到变量中(最简单但不理想)自定义RNG
编写自己的RNG将耗费时间,易于出错,并且未经优化。您可以在网上搜索有关如何执行此操作的算法,但每个算法都有其不同的怪癖。有些交换性能以换取随机性,而其他随机数模式可能是可预测的。
更改标准库中的
math.randomseed这样做_可能会_危及使用
math库的任何第三方模块或库。更不用说如果您不知道自己在做什么,这可能会导致Lua本身出现问题。加载RNG
有多个用Lua编写的RNG模块可用。我强烈建议您选择一个适合您需求的模块,并确保它能够获取当前种子。rotLove有多个可执行此操作的模块,但使用它们存在一个警告。您为其中一个模块设置的RNG种子不会用于种子
math.randomseed。相关故事...
这个问题最近发生在试图使用rotLove的RNG和我开发的一款骰子模块的某人身上。骰子使用
math.random来确定投掷结果。该人已使用RNG.randomseed设置了种子,并假定它将影响所有的math.random操作,结果发现每次运行应用程序都产生相同的骰子结果。这是因为他们从未设置math.randomseed!因此,我将我的骰子模块添加到rotLove中,以便它使用所提供的RNG生成骰子点数,而不必同时使用第三方RNG和默认的Lua RNG。存储变量
设置种子后,每次调用
math.random时,将变量加1。当您需要获取种子时,math.randomseed(orginal_seed_provided) seed_counter = 0 -- 每次调用math.random都加一 -- 每当您需要当前种子时,这就是seed_counter -- 运行代码 -- 突然您需要将RNG重置为以前的种子 math.randomseed(orginal_seed_provided) for i=1, seed_counter do math.random() -- 丢弃之前math.random操作的结果 end -- 下一次调用math.random()将从种子离开的地方开始此选项具有_可怕的后果_,因为您使用
math.random()越多,就需要越多的函数调用才能获得埋藏的种子。一旦您在调用100,000次以上的
math.random()之后获得种子,它将成为一个CPU负担,具有明显的效果,请注意。