是否可以反转伪随机数生成器?例如,获取一组生成的数字并获取原始种子。如果是这样,这将如何实施?
3 回答
这是绝对可能的——您只需要创建一个适合您的目的的 PRNG。这取决于您需要完成什么——如果您更详细地描述您的情况,我很乐意提供更多建议。
对于一般背景,这里有一些用于反转线性同余生成器的资源: 可逆伪随机序列生成器
这里有一些用于反转梅森捻线器: http ://www.randombit.net/bitbashing/2009/07/21/inverting_mt19937_tempering.html http://b10l.com/reversing-the-mersenne-twister-rng-temper -功能/
一般来说,没有。如果您拥有完整的数字数组,大多数生成器应该是可能的。如果你没有所有的数字或不知道你有哪些数字(你有第 12 个还是第 300 个?),你根本无法弄清楚,因为你不知道在哪里停下来。
您必须知道生成器的详细信息。解码线性同余生成器将不同于基于计数器的 PRNG,后者将不同于梅森捻线器,后者与斐波那契生成器不同。另外,您可能需要知道生成器的参数。如果您拥有所有这些并且生成数字的方程式是可逆的,那么这是可能的。至于如何,这真的取决于PRNG。
使用Janus语言进行可逆计算,这是一种时间可逆的语言。
您可能会做一些事情,例如创建一个执行此操作的程序(伪代码):
x = seed
x = my_Janus_prng(x)
x = reversible_modulus_op(x, N) + offset
Janus 有能力为您提供一个程序,该程序采用输出数字和任何其他数据来反转所有内容,并为您提供以 . 结尾的程序x = seed
。
我不知道有关 Janus 的所有细节或您如何做到这一点,但只是想我会提到它。
显然,您想要做的可能是一个更好的主意,因为如果 RNG 不是单射函数,那么它应该映射回什么等等。
所以你想编写一个输出数组的 Janus 程序。Janus 反转程序的输入将采用一个数组(理想情况下)。