Random 随机存取随机置换

Random 随机存取随机置换,random,Random,我想生成一个非常大的伪随机置换p:[0,n-1]->[0,n-1],然后计算m个特定值p[I],其中m一个非常低强度的示例版本: 在[0,n-1]中生成2k=O(1)个随机整数a_i,b_i,a_i相对素数为n 选择一个弱排列wp:[0,n-1]->[0,n-1],假设w(i)=i,除高位外,其他所有元素都翻转 p[i]=b_0+a_0*wp(b_1+a_1*wp(…i…) 编辑:我认为杰夫还会写更多的东西 有两种生成置换的常用算法。Knuth的shuffle本质上是顺序的,所以不是并行的好选择

我想生成一个非常大的伪随机置换p:[0,n-1]->[0,n-1],然后计算m个特定值p[I],其中m一个非常低强度的示例版本:

  • 在[0,n-1]中生成2k=O(1)个随机整数a_i,b_i,a_i相对素数为n
  • 选择一个弱排列wp:[0,n-1]->[0,n-1],假设w(i)=i,除高位外,其他所有元素都翻转
  • p[i]=b_0+a_0*wp(b_1+a_1*wp(…i…)

  • 编辑:我认为杰夫还会写更多的东西

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

  • [0,n-1]
    中,对
    所需的
    中的每个
    i
    随机抽样
  • 从所需的
    中删除所有未冲突的条目,以及(可选)从冲突中删除一些确定性选择(例如,如果
    i<{j|p[j]=p[i]}
    ,则保留
    p[i]
  • 使用所需的新(较小)集合
    重复步骤1

  • 由于我们在这个过程中没有损失熵,结果基本上等同于以不同顺序进行的顺序随机抽样,从没有碰撞的位置开始(我们只是事先不知道顺序)。请注意,如果我们在比较中使用计算值,例如,我们会引入偏差。

    主要是重复的。此解决方案确实回答了上述问题,但没有解决不同并行过程需要协调选择哪种排列的激励问题。我来编辑这个问题。k指的是什么?$k$是一个小整数。然而,这个答案应该被忽略:这是真正的答案: