【发布时间】:2012-12-29 01:39:02
【问题描述】:
我想生成一个非常大的伪随机排列 p : [0,n-1] -> [0,n-1],然后计算 m 个特定值 p[i],其中 m
请注意,为了在并行情况下有所帮助,计算不相交的 i 值集的不同进程不应意外产生 p[i] == p[j] for i != j。
【问题讨论】:
标签: random
我想生成一个非常大的伪随机排列 p : [0,n-1] -> [0,n-1],然后计算 m 个特定值 p[i],其中 m
请注意,为了在并行情况下有所帮助,计算不相交的 i 值集的不同进程不应意外产生 p[i] == p[j] for i != j。
【问题讨论】:
标签: random
编辑:我认为 Geoff 会写更多 clever algorithm based on block ciphers。
有两种常见的算法来生成排列。 Knuth 的 shuffle 本质上是顺序的,因此不是并行性的好选择。另一种是随机选择,只要遇到重复就重试。随机选择在以任何顺序应用时显然是等效的,因此我提出以下简单算法:
Needed 中的每个i 在[0,n-1] 中随机抽样候选p[i](并行)。Needed 中删除所有未冲突的条目,以及(可选)从冲突中做出的一些确定性选择(例如,如果i < {j | p[j] = p[i]},则保留p[i])。Needed 从第 1 步重复。由于我们在这个过程中没有丢失熵,结果本质上相当于以某种不同的顺序进行顺序随机抽样,从没有碰撞的位置i开始(我们只是事先不知道那个顺序)。请注意,例如,如果我们在比较中使用计算值,我们就会引入偏差。
【讨论】:
一个非常低强度的例子:
【讨论】: