从lua获取当前随机种子

我知道你可以用 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 中是否存在这样的函数,或者我必须为此编写自己的生成器?

点赞
用户1213111
用户1213111

目前标准的Lua库中没有获取当前种子的函数。您需要做以下操作之一:

  1. 自己编写RNG函数(困难

  2. 更改C语言编写的math.randomseed函数(有风险

  3. 使用具有此功能的RNG库(简单

  4. 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负担,具有明显的效果,请注意。

2017-07-09 21:07:16