随机访问随机排列

时间:2012-12-29 01:39:02

标签: random

我想生成一个非常大的伪随机置换p:[0,n-1] - &gt; [0,n-1],然后计算m个特定值p [i],其中m <&lt;&lt; ñ。是否可以在O(m)时间内完成此操作?动机是一个大型并行计算,其中每个处理器只需要查看一小部分排列,但排列必须在处理器之间保持一致。

注意,为了帮助并行情况,计算不相交的i值集的不同进程不应该意外地为i!= j生成p [i] == p [j]。

2 个答案:

答案 0 :(得分:2)

编辑:我认为Geoff会写出更多clever algorithm based on block ciphers

有两种常用的算法可用于生成排列。 Knuth的shuffle本质上是顺序的,因此不是并行的好选择。另一种是随机选择,只要遇到重复,就重试。当以任何顺序应用时,随机选择显然是等价的,因此我提出以下简单算法:

  1. p[i]中的[0,n-1](并行)中的i随机抽取Needed中的候选人{。}}。
  2. Needed中删除所有未冲突的条目,以及(可选)从冲突中选择一些确定性的条目(例如,p[i]时保留i < {j | p[j] = p[i]}
  3. 使用新的(较小的)集Needed重复步骤1。
  4. 由于我们在此过程中没有丢失熵,因此结果基本上等同于以不同顺序的顺序随机抽样,从未发生碰撞的位置i开始(我们只是不知道该顺序提前)。请注意,如果我们在比较中使用计算值,例如,我们就会引入偏差。

答案 1 :(得分:0)

非常低强度版本的示例:

  1. 在[0,n-1]中生成2k = O(1)个随机整数a_i,b_i,a_i相对于n的素数。
  2. 选择弱置换wp:[0,n-1] - &gt; [0,n-1],比如w(i)= i,只有高位翻转。
  3. p [i] = b_0 + a_0 * wp(b_1 + a_1 * wp(... i ...))