随机存取随机排列

计算科学 分区 随机算法
2021-11-25 20:30:57

我有大量的并行进程和一个大整数n,并且想要随机划分整数[0,n)在过程中只有O(1)沟通。

一种很好的方法是生成伪随机排列πSn表示为一个小函数,因此只需要交换随机密钥/种子。有没有好的方法来做到这一点?

1个回答

挑选2k略大于n, 生成一个块密码fS2k操作于k位块,并构造一个排列[0,n)通过沿着循环行走f直到我们回到所需的范围内。具体来说,给定x<n我们设置

g(x)=fp(x)=f(f(f(...x...)))
在哪里p是最小正整数 stfp(x)<n.

如果2k=O(n),并且块密码很好,步行需要O(1)预计时间。注意p必然是有限的,因为最终我们将绕回循环并找到fp(x)=x.

有关更多详细信息,请参阅

  1. Black 和 Rogaway,具有任意有限域的密码,2001 年。
  2. http://blog.notdot.net/2007/9/Damn-Cool-Algorithms-Part-2-Secure-permutations-with-block-ciphers

这是一个使用截断 TEA 块密码的示例实现,如 (2) 中所述:

https://github.com/otherlab/core/blob/f09fbd19dbaa7b9033eb0888594273a6a3d592a5/random/permute.cpp