随机数w /种子作用非确定性

时间:2016-02-09 01:55:55

标签: android algorithm random lua corona

我已编程多年,我现在提出的问题可能是我遇到的最奇怪的问题之一。

我的应用程序中有一段代码随机生成一系列令牌,有三种可能的类型,比如A,B或C.

所以10个代币可能是ABCCAAABAC。

在代码块的开头,随机数生成器种子初始化如下:

math.randomseed(seed)
math.random()

现在,毫不奇怪当种子值保持不变时,我总是得到相同的令牌序列,因为随机生成代码以确定的方式执行。好吧,几乎总是。

实际上,在极少数情况下,出乎同样的种子,我会得到一个不同的随机序列。然后它在我知道之前恢复正常。你可能在想 - 啊,副作用,这可能是一个状态相关的问题,其中生成随机令牌序列的代码块利用一个变量来改变它调用的次数{{1 }} (例如)。但是,我99%肯定我控制了所有明显的副作用。在访问外部状态的代码块中只有少数几个位置,它们都保持不变。

情节变得更加浓厚 - 这个问题在我一直在构建的应用程序的Android部署上才显而易见。不可否认,这是一个罕见的错误,我似乎无法可靠地重复它。因此它也可能出现在iOS部署中。但我还没有在其他平台上遇到它。我不妨提一下,我正在通过Corona SDK使用lua脚本来开发应用程序。

我已经考虑过这个问题,并将其缩小到几个可能性:

  1. 与另一个使用相同随机数生成器的线程交互,我不知道
  2. (这在lua中甚至可能吗?)某种堆损坏会导致奇怪的副作用
  3. 我已经搞砸了,而且在很长时间的调试中我错过了外部状态的明显参考
  4. 所有这些最痛苦的方面是bug的不可重复性。大多数情况下,代码块在给定重复种子的情况下完全确定性地起作用。然后就好像存在非确定性的阶段,然后在一段未知的时间后再次消失。我很乐意在这里挑选专家的大脑。

    这可能会发生什么?此外 - 是否可能有任何特定于平台的特定问题,因为我只在Android部署中看到它?

    供参考,这是完整的代码块。它实际上是生成具有两个随机属性(三种颜色之一,三种形状之一)的标记,但这并不意味着问题的本质。

    random()

1 个答案:

答案 0 :(得分:1)

https://docs.coronalabs.com/api/library/math/random.html州:

  

此函数是ANSI C提供的简单伪随机生成器函数rand的接口。不能保证其统计属性。

这让我想知道其他程序是否使用相同的功能。 这可能导致这些冲突,同时也或多或少地解释了为什么它们有时只会发生。