我有一个庞大的,相当复杂的程序内容生成lua项目。出于调试目的,我希望能够做的一件事是使用随机种子,以便我可以重新运行系统&得到相同的结果。
最后,我在跑步开始时打印出种子。问题是,每次运行它时,我的结果仍然完全不同。假设种子在其他任何地方都没有变化,这不可能,对吗?
我的问题是,还有哪些方法可以影响lua的math.random()的输出?我已经搜索了项目中的所有代码,并且只有一个地方我调用math.randomseed(),然后我在任何之前执行此操作。我没有使用时间或日期进行任何计算,因此不会影响结果......我还能错过什么?
更新于2016年2月22日猴子修补math.random& math.randomseed经常(但不总是)输出相同的随机数序列。但结果仍然不一样 - 所以我想现在真正的问题:lua中的哪些行为是不确定的,并且当相同的代码按顺序运行时可能导致不同的输出?注意到它的分歧,何时发生,正在帮助我缩小范围,但我仍然无法找到它。 (此代码 NOT 使用协同程序,所以我不认为它是线程/竞争条件问题)
答案 0 :(得分:1)
import com.google.android.gms.maps.model.TileOverlay;
import com.google.android.gms.maps.model.TileOverlayOptions;
正在使用randomseed
/ srandom
函数,"将其参数设置为随机返回的新的伪随机整数序列的种子() "
我可以提供几种可能的解释:
srand
,但你没有(randomseed
会在这种情况下为你初始化序列。)random
一次,但是您多次调用它(或者代码的其他部分也会调用randomseed
,可能在您的序列中的不同时间)。randomseed
(多次),这会为您的部分代码生成不同的结果。random
/ srandom
处理中存在错误。random
或srandom
功能出现问题。获取有关您的Lua版本和系统的一些信息(除了演示问题的小例子)将有助于弄清楚导致此问题的原因。
2016/2/22更新:检查起来应该相当容易; monkeypatch random
和math.randomseed
并记录所有调用以及函数返回的值,以便进行两次后续运行。比较结果。如果结果不同,您应该能够找出它们之间的差异,并在较小的示例上重现。您还可以使用math.random
查看函数的调用位置。
答案 1 :(得分:0)
正如documentation所述,正确的种子会产生相等的数字序列。
在将种子设置为已知常量值之后,立即输出对rand的调用 - 如果这在运行中有所不同,则您知道某些内容严重错误(库下载损坏,重新安装,伽马射击您的驱动器等)。 / p>
假设第一个值匹配运行,请在代码中间添加另一个输出。从那里,您可以使用二进制搜索来查找出错的地方(I.E.前半部分或后半部分代码块)。
虽然你可以&应该使用一些直觉来找到错误,记住,如果只有直觉就足够了,你就已经找到了它,因此有必要进行一些系统的消除。
修订以涵盖关于数组顺序的注释:
如果可能,请使用调试工具。 detecting when the value of a Lua variable changes上的这篇SO帖子可能会有所帮助。
在没有工具的情况下,这是解决此问题的一种方法:
任何大型数组的完整调试转储很快就变得混乱,很难发现变化。相反,我会使用一些额外的变量&一个简洁的测试功能。
制作数组的两个深层副本。我们称他们为debug01
& debug02
&调用原始数组original
。接下来,故意交换debug02
中的两个元素的顺序。
接下来,构建一个函数来比较两个数组&测试他们的元素是否匹配&如果没有,则返回/打印第一个不匹配的索引。初始化阵列后,立即测试它们以确保:
original
& debug01
匹配original
&amp; <{1}}不符合debug02
&amp; original
您改变它们的地方不匹配我无法强调使用未经验证的(因而可能有漏洞的)测试功能来追踪错误的疯狂。
一旦您验证了该功能的工作原理,您就可以再次使用二进制搜索将零点放在轨道上。和以前一样,平衡系统搜索的使用与你的直觉。