algorithm - 非常大的集合的即时伪随机排列,无需重复和逆运算

标签 algorithm random permutation lcg

我有一组非常大的值 (0-300000^700),我想找到一种算法,该算法可以在同一组中双射分配唯一值。

这相当于一个排列,但由于明显的内存问题,必须“即时”完成。并且该算法在某些时候需要反转。

此问题与“babel 库”中的这个问题类似:http://www.fromquarkstoquasars.com/meet-the-digital-library-of-babel-a-complete-combination-of-every-possible-combination-of-letters-ever/

使用 LCG,使用 Hull-Dobell 定理设置参数以确保不重复。种子用作初始值。我不明白逆向是如何可能的(即从输出中获取种子),因为我认为这需要暴力破解。

最佳答案

对于 LCG,种子与状态相同,用作计算下一个的前一个值。已知 LCG 是可逆的,如果

next = (a * prev + c) mod m

然后

prev = (next - c) * a_inv mod m

其中 a_inv 可以使用 Euclid 算法计算

更多讨论在这里

Reversible pseudo-random sequence generator

关于algorithm - 非常大的集合的即时伪随机排列,无需重复和逆运算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32878370/

相关文章:

javascript - 使用 forge(或其他 JavaScript 方法)生成随机大素数

c++ - 如何洗牌包括最后一个元素的数组?

c++ - 集合与重复的组合

c++ - 在 C++ 中迭代具有可变维度大小的 N 维矩阵

java - 查找出现最小值的数组索引

C++ 最大公约数

linq - 另一个排列词难题…与Linq一起吗?

java - 在列表中查找回文

c - 如何从随机数生成器返回中间位?

algorithm - 是否有一种算法可以生成多重集的所有唯一循环排列?