即使在Lua中使用相同的随机种子,也会得到不同的结果?

时间:2016-02-22 00:50:00

标签: random lua procedural-generation

我有一个庞大的,相当复杂的程序内容生成lua项目。出于调试目的,我希望能够做的一件事是使用随机种子,以便我可以重新运行系统&得到相同的结果。

最后,我在跑步开始时打印出种子。问题是,每次运行它时,我的结果仍然完全不同。假设种子在其他任何地方都没有变化,这不可能,对吗?

我的问题是,还有哪些方法可以影响lua的math.random()的输出?我已经搜索了项目中的所有代码,并且只有一个地方我调用math.randomseed(),然后我在任何之前执行此操作。我没有使用时间或日期进行任何计算,因此不会影响结果......我还能错过什么?

更新于2016年2月22日猴子修补math.random& math.randomseed经常(但不总是)输出相同的随机数序列。但结果仍然不一样 - 所以我想现在真正的问题:lua中的哪些行为是不确定的,并且当相同的代码按顺序运行时可能导致不同的输出?注意到它的分歧,何时发生,正在帮助我缩小范围,但我仍然无法找到它。 (此代码 NOT 使用协同程序,所以我不认为它是线程/竞争条件问题)

2 个答案:

答案 0 :(得分:1)

import com.google.android.gms.maps.model.TileOverlay; import com.google.android.gms.maps.model.TileOverlayOptions; 正在使用randomseed / srandom函数,"将其参数设置为随机返回的新的伪随机整数序列的种子() "

我可以提供几种可能的解释:

  1. 你认为你打电话给srand,但你没有(randomseed会在这种情况下为你初始化序列。)
  2. 您认为您曾拨打random一次,但是您多次调用它(或者代码的其他部分也会调用randomseed,可能在您的序列中的不同时间)。
  3. 代码的其他部分调用randomseed(多次),这会为您的部分代码生成不同的结果。
  4. 生成的序列没有任何问题,但您错误地解释了结果。
  5. 您的Lua版本在random / srandom处理中存在错误。
  6. 系统中的randomsrandom功能出现问题。
  7. 获取有关您的Lua版本和系统的一些信息(除了演示问题的小例子)将有助于弄清楚导致此问题的原因。

    2016/2/22更新:检查起来应该相当容易; monkeypatch randommath.randomseed并记录所有调用以及函数返回的值,以便进行两次后续运行。比较结果。如果结果不同,您应该能够找出它们之间的差异,并在较小的示例上重现。您还可以使用math.random查看函数的调用位置。

答案 1 :(得分:0)

正如documentation所述,正确的种子会产生相等的数字序列。

在将种子设置为已知常量值之后,立即输出对rand的调用 - 如果这在运行中有所不同,则您知道某些内容严重错误(库下载损坏,重新安装,伽马射击您的驱动器等)。 / p>

假设第一个值匹配运行,请在代码中间添加另一个输出。从那里,您可以使用二进制搜索来查找出错的地方(I.E.前半部分或后半部分代码块)。

虽然你可以&应该使用一些直觉来找到错误,记住,如果只有直觉就足够了,你就已经找到了它,因此有必要进行一些系统的消除。

修订以涵盖关于数组顺序的注释:

如果可能,请使用调试工具。 detecting when the value of a Lua variable changes上的这篇SO帖子可能会有所帮助。

在没有工具的情况下,这是解决此问题的一种方法:

任何大型数组的完整调试转储很快就变得混乱,很难发现变化。相反,我会使用一些额外的变量&一个简洁的测试功能。

制作数组的两个深层副本。我们称他们为debug01& debug02&调用原始数组original。接下来,故意交换debug02中的两个元素的顺序。

接下来,构建一个函数来比较两个数组&测试他们的元素是否匹配&如果没有,则返回/打印第一个不匹配的索引。初始化阵列后,立即测试它们以确保:

  1. original& debug01匹配
  2. original&amp; <{1}}不符合
  3. debug02&amp; original您改变它们的地方不匹配
  4. 我无法强调使用未经验证的(因而可能有漏洞的)测试功能来追踪错误的疯狂。

    一旦您验证了该功能的工作原理,您就可以再次使用二进制搜索将零点放在轨道上。和以前一样,平衡系统搜索的使用与你的直觉。