重复有偏差的随机混乱会减少偏差吗?

时间:2010-09-29 22:29:06

标签: algorithm random permutation shuffle

我希望以最小的偏差反复产生快速随机混洗。

众所周知,只要基础随机数发生器(RNG)是无偏的,Fisher-Yates shuffle就是无偏的。

To shuffle an array a of n elements:
  for i from n − 1 downto 1 do
       j ← random integer with 0 ≤ j ≤ i
       exchange a[j] and a[i]

但是如果RNG有偏见(但很快)怎么办?

假设我想生成25个元素数组的许多随机排列。如果我使用具有偏置RNG的Fisher-Yates算法,那么我的置换将是有偏差的,但我相信这假设25元素阵列在每次应用混洗算法之前从相同的状态开始。例如,一个问题是如果RNG只有2 ^ 32~10 ^ 9的周期,我们就不能产生25个元素的每个可能的排列,因为这是25! ~10 ^ 25个排列。

我的一般问题是,如果我在开始Fisher-Yates shuffle的每个新应用之前将洗牌后的元素拖垮,这会减少偏差和/或允许算法产生每个排列吗?

我的猜测是它通常会产生更好的结果,但似乎重复洗牌的数组有许多与基础RNG相关的元素,这些排列实际上可能比预期更频繁地重复。

有没有人知道任何解决这个问题的研究?

作为一个子问题,如果我只想重复排列数组中25个元素中的5个元素,那么我使用Fisher-Yates算法选择5个元素并在完成一个完整的shuffle之前停止? (我使用交换的数组末尾的5个元素。)然后我重新使用前面部分改组的25个元素数组来选择另一个5的排列。再次,看起来这比从如果基础RNG有偏差,则原始的25个元素阵列。有什么想法吗?

我认为测试部分shuffle案例会更容易,因为25个元素中有5个元素只有6,375,600种可能的排列,所以有没有简单的测试来检查偏差?

5 个答案:

答案 0 :(得分:3)

  

如果RNG只有2 ^ 32~的周期   10 ^ 9我们不可能产生一切可能   25个元素的排列因为   这是25! ~10 ^ 25个排列

只有种子确定每个连续的选择时,这才是真的。只要您的RNG可以在每个下一个选择指定的范围内提供精确均匀的分布,那么它就可以产生每个排列。如果您的RNG无法做到这一点,拥有更大的种子基础将无济于事。

至于你的副作用问题,你可能会为每次抽签重新调整一下。但是,重新生成发生器仅在重新接种它包含足够的熵时才有用。时间戳不包含太多熵,也没有算法计算。

我不确定这个解决方案是什么的一部分,因为你没有列出它,但如果你试图使用随机输入从更大的域计算某些东西,可能有更好的方法。

答案 1 :(得分:2)

有几点:

1)任何使用Fisher Yates shuffle的人都应该阅读this,并确保他们的实施是正确的。
2)不重复洗牌会失败使用更快的随机数发生器的目的吗?当然,如果你不得不重复每次洗牌5次以获得所需的熵,那么你最好使用低偏置发生器。
3)你有一个可以测试它的设置吗?如果是这样开始尝试 - Jeffs图表清楚地表明,通过使用小型套牌并在视觉上描绘结果,您可以轻松检测到相当多的错误。

答案 2 :(得分:2)

我的感觉是,对于有偏见的RNG,Knuth shuffle的重复运行将产生所有排列,但我无法证明它(它取决于RNG的周期和how much biased it is)。 / p>

让我们改回一个问题:给定一个需要随机输入和偏置RNG的算法,是否更容易去除算法的输出或使RNG的输出偏斜?

不出所料,后者更容易做(并且更广泛的兴趣):有几种标准技术可以做到这一点。由于Von Neumann,一个简单的技术是:给定来自偏置RNG的比特流,成对取比特,扔掉每个(0,0)和(1,1)对,每回一个(1,0)对和每个(0,1)对的0。该技术假定比特来自流,其中每个比特具有与流中的任何其他比特相同的0或1的概率,并且该比特不相关。 Elias概括了von Neumann的技术to a more efficient scheme(丢弃较少位的技术)。

但即使是强烈偏向或相关的比特,也可能包含有用的随机性,例如using a technique based on Fast Fourier Transform

另一个选择是将有偏差的RNG输出馈送到加密强函数,例如消息摘要算法,并使用其输出。

有关如何对随机数生成器进行去偏差的进一步参考,建议您阅读Randomness Recommendations for Security RFC

我的观点是,如果基于随机的算法的输出受到RNG提供的熵的上限,那么质量如果:如果它是极度偏置的,那么无论你做什么,输出都会非常偏向。该算法不能比偏置的随机比特流中包含的熵更多地挤压熵。更糟糕的是:它可能会丢失一些随机位。即使假设该算法使用有偏差的RNG,为了获得良好的结果,您也必须将计算工作量至少与去除RNG所需的努力一样大(但它可能需要更多努力,因为你必须同时运行算法并同时“击败”偏差。

如果你的问题只是理论问题,那么请忽略这个答案。如果它是实用的,那么请认真考虑去除你的RNG,而不是假设算法的输出。

答案 3 :(得分:1)

我无法完全回答你的问题,但这种观察似乎太长了,无法发表评论。

如果您确保每次迭代的Fisher-Yates从您的RNG中提取的随机数的数量与RNG期间具有最高的最小公倍数,会发生什么?这可能意味着您在算法结束时“浪费”一个随机整数。当洗牌25个元素时,你需要24个随机数。如果你在最后再抽一个随机数,产生25个随机数,你就不能保证重复的时间比RNG周期长得多。现在,当然,随机地,你可以在到达期间之前连续出现相同的25个数字。但是,由于25除了1和2 ^ 32之外没有其他共同因素,因此在25 *(2 ^ 32)之前你不会达到保证重复。现在,这不是一个巨大的改进,但你说这个RNG很快。如果“浪费”值大得多怎么办?获得每个排列可能仍然不实际,但你至少可以增加你可以达到的数量。

答案 4 :(得分:1)

完全取决于偏见。一般来说,我会说“不要指望它”。

有偏见的算法收敛于无偏见:

一半时间不做任何事,而另一半则正确地洗牌。以指数方式趋向于无偏见。在n次改组之后,有一次1-1 / 2 ^ n的机会,shuffle是无偏的,输入序列被选中的概率为1/2。

有偏见的偏见算法:

随机播放除最后一个元素之外的所有元素。永久偏向于不移动最后一个元素。

更多一般示例:

将shuffle算法视为排列的加权有向图,其中节点外的权重对应于在混洗时从一个排列转换到另一个排列的概率。偏差的混洗算法将具有非均匀权重。

现在假设您用该水填充该图中的一个节点,并且水根据权重从一个节点流向下一个节点。如果无论起始节点水的分布是否均匀,该算法将收敛到无偏差。

那么在什么情况下水不会均匀分布?好吧,如果你有一个高于平均重量的周期,周期中的节点将倾向于相互馈电并保持在平均水量之上。他们不会全部采取这些措施,因为当他们获得更多的水时,进入的数量会减少,而外出量会增加,但是会高于平均值。