14

是否可以反转伪随机数生成器?例如,获取一组生成的数字并获取原始种子。如果是这样,这将如何实施?

4

3 回答 3

7

这是绝对可能的——您只需要创建一个适合您的目的的 PRNG。这取决于您需要完成什么——如果您更详细地描述您的情况,我很乐意提供更多建议。

对于一般背景,这里有一些用于反转线性同余生成器的资源: 可逆伪随机序列生成器

伪随机分布,保证值序列的所有可能排列 - C++

这里有一些用于反转梅森捻线器: http ://www.randombit.net/bitbashing/2009/07/21/inverting_mt19937_tempering.html http://b10l.com/reversing-the-mersenne-twister-rng-temper -功能/

于 2015-06-02T15:10:50.383 回答
0

一般来说,没有。如果您拥有完整的数字数组,大多数生成器应该是可能的。如果你没有所有的数字或不知道你有哪些数字(你有第 12 个还是第 300 个?),你根本无法弄清楚,因为你不知道在哪里停下来。

您必须知道生成器的详细信息。解码线性同余生成器将不同于基于计数器的 PRNG,后者将不同于梅森捻线器,后者与斐波那契生成器不同。另外,您可能需要知道生成器的参数。如果您拥有所有这些并且生成数字的方程式是可逆的,那么这是可能的。至于如何,这真的取决于PRNG。

于 2014-11-14T21:47:10.647 回答
0

使用Janus语言进行可逆计算,这是一种时间可逆的语言。

您可能会做一些事情,例如创建一个执行此操作的程序(伪代码):

x = seed
x = my_Janus_prng(x)
x = reversible_modulus_op(x, N) + offset

Janus 有能力为您提供一个程序,该程序采用输出数字和任何其他数据来反转所有内容,并为您提供以 . 结尾的程序x = seed

我不知道有关 Janus 的所有细节或您如何做到这一点,但只是想我会提到它。

显然,您想要做的可能是一个更好的主意,因为如果 RNG 不是单射函数,那么它应该映射回什么等等。

所以你想编写一个输出数组的 Janus 程序。Janus 反转程序的输入将采用一个数组(理想情况下)。

于 2022-01-28T06:03:42.043 回答