我有一组非常大的值 (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 算法计算
更多讨论在这里
关于algorithm - 非常大的集合的即时伪随机排列,无需重复和逆运算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32878370/