非常大的集合的即时伪随机排列,无需重复和逆运算
On-the-fly pseudo-random permutation of very large set without repeating and with inverse operation
我有一组非常大的值 (0-300000^700),我想找到一种算法,该算法可以在同一组中双射分配唯一值。
它相当于一个排列,但由于明显的内存问题,必须这样做"on the fly"。并且该算法在某些时候需要反转。
这个问题类似于 "library of 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,种子与状态相同,作为前一个值来计算下一个 one.LCG 已知是可逆的,如果
next = (a * prev + c) mod m
然后
prev = (next - c) * a_inv mod m
其中 a_inv
可以使用欧几里得算法计算
更多讨论在这里
Reversible pseudo-random sequence generator
我有一组非常大的值 (0-300000^700),我想找到一种算法,该算法可以在同一组中双射分配唯一值。
它相当于一个排列,但由于明显的内存问题,必须这样做"on the fly"。并且该算法在某些时候需要反转。
这个问题类似于 "library of 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,种子与状态相同,作为前一个值来计算下一个 one.LCG 已知是可逆的,如果
next = (a * prev + c) mod m
然后
prev = (next - c) * a_inv mod m
其中 a_inv
可以使用欧几里得算法计算
更多讨论在这里
Reversible pseudo-random sequence generator