我想生成一个非常大的伪随机置换p:[0,n-1] - &gt; [0,n-1],然后计算m个特定值p [i],其中m <&lt;&lt; ñ。是否可以在O(m)时间内完成此操作?动机是一个大型并行计算,其中每个处理器只需要查看一小部分排列,但排列必须在处理器之间保持一致。
注意,为了帮助并行情况,计算不相交的i值集的不同进程不应该意外地为i!= j生成p [i] == p [j]。
答案 0 :(得分:2)
编辑:我认为Geoff会写出更多clever algorithm based on block ciphers。
有两种常用的算法可用于生成排列。 Knuth的shuffle本质上是顺序的,因此不是并行的好选择。另一种是随机选择,只要遇到重复,就重试。当以任何顺序应用时,随机选择显然是等价的,因此我提出以下简单算法:
p[i]
中的[0,n-1]
(并行)中的i
随机抽取Needed
中的候选人{。}}。Needed
中删除所有未冲突的条目,以及(可选)从冲突中选择一些确定性的条目(例如,p[i]
时保留i < {j | p[j] = p[i]}
。Needed
重复步骤1。由于我们在此过程中没有丢失熵,因此结果基本上等同于以不同顺序的顺序随机抽样,从未发生碰撞的位置i
开始(我们只是不知道该顺序提前)。请注意,如果我们在比较中使用计算值,例如,我们就会引入偏差。
答案 1 :(得分:0)
非常低强度版本的示例: