我知道您可以使用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中是否存在任何此类函数,或者我是否必须为此目的编写自己的生成器?
答案 0 :(得分:1)
目前,标准Lua库中没有获取当前种子的函数。要做到这一点,你需要:
编写自己的RNG功能(困难)
更改用C编写的math.randomseed
函数(冒险)
使用具有此功能的RNG lib(简单)
保存math.random
被调用到变量的次数(最简单但不理想)
编写自己的RNG会很费时,容易出错,而且没有优化。您可以搜索有关如何在线执行此操作的算法,但每种算法都会有不同的怪癖。一些随机性的交易表现,而其他随机数模式可能是可预测的。
math.randomseed
执行此操作可能会危害使用math
库的任何第三方模块或库。更不用说如果你不知道自己在做什么,这可能会导致Lua本身出现问题。
有多个用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 -- 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消耗,具有明显的效果,所以请注意。