从lua获取当前随机种子

时间:2017-06-08 15:07:36

标签: random lua

我知道您可以使用math.randomseed()设置lua随机数生成器的种子。

我想在某种程度上并行地生成两个单独的确定性数字序列。我已经将问题减少到了这个效果:

-- assume seed1 and seed2 exist and are positive integers.
local sequence1 = {};
local sequence2 = {};

math.randomseed(seed1);
for i = 1,50 do
    sequence1[#sequence1 + 1] = math.random();
end
seed1 = math.getseed(); -- This is the function that I want.

-- stuff

math.randomseed(seed2);
for i = 1,75 do
    sequence2[#sequence2 + 1] = math.random();
end
seed2 = math.getseed(); -- This is the function that I want.

-- stuff


math.randomseed(seed1);
for i = 1,50 do
    sequence1[#sequence1 + 1] = math.random();
end
seed1 = math.getseed(); -- This is the function that I want.

我查看了文档并将math表抛出到k,v in pairs for循环中,没有任何内容出现。 在lua中是否存在任何此类函数,或者我是否必须为此目的编写自己的生成器?

1 个答案:

答案 0 :(得分:1)

目前,标准Lua库中没有获取当前种子的函数。要做到这一点,你需要:

  1. 编写自己的RNG功能(困难

  2. 更改用C编写的math.randomseed函数(冒险

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

  4. 保存math.random被调用到变量的次数(最简单但不理想

  5. 自定义RNG

    编写自己的RNG会很费时,容易出错,而且没有优化。您可以搜索有关如何在线执行此操作的算法,但每种算法都会有不同的怪癖。一些随机性的交易表现,而其他随机数模式可能是可预测的。

    更改标准库中的math.randomseed

    执行此操作可能会危害使用math库的任何第三方模块或库。更不用说如果你不知道自己在做什么,这可能会导致Lua本身出现问题。

    加载RNG

    有多个用Lua编写的RNG模块可用。我强烈建议您选择一个适合您需求的产品,并确保它能够获得当前的种子。 rotLove有多个这样做,但有一个警告使用它们。您为其中一个模块设置的RNG种子不会种子math.randomseed

    A relevant story on this...

    这个问题最近发生在试图同时使用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  -- every time math.random is called add one
    -- whenever you need the current seed, it's the seed_counter
    
    -- run code
    -- suddenly you need to reset RNG to a previous seed
    
    math.randomseed(orginal_seed_provided)
    for i=1, seed_counter do 
      math.random() -- discarding the results from prior math.random operations 
    end  
    -- next call to math.random() will be where seed left off 
    

    此选项具有可怕后果,因为您使用math.random()的次数越多,您必须进行更多函数调用才能获取埋藏的种子。

    math.random被调用100,000次以上之后,一旦你获得种子,那将是一个CPU消耗,具有明显的效果,所以请注意。