如何对这个随机生成器进行逆向工程,以便它返回初始值" 123456"从生成的随机值?
public class calcus {
public static void main(String[] args) {
int count = 0;
StringBuilder sb = new StringBuilder();
Random r = new Random(123456);
while (count < 7) {
count++;
sb.append(r.nextInt(27)).append(",");
}
String[] reverseNumber= sb.toString().split(",");
System.out.println(Arrays.toString(reverseNumber)); // [9, 11, 19, 16, 19, 4, 15]
}
}
答案 0 :(得分:2)
从字面上看,您不需要对Random类进行逆向工程。
发布源代码供所有人查看。 (例如,谷歌搜索“java.util.Random source”...)
它使用的算法在javadocs中有详细描述,您可以重新实现它。甚至是用于设置种子的算法。
但是如果你问是否可以向后运行随机序列来恢复种子,你需要仔细检查代码并找出LCG的反函数。但我不确定这是否足够,因为nextInt(int)
甚至nextInt()
不会返回生成器的整个48位状态。
要解决这个问题,你可能需要做一些“讨厌的反思”来提取状态。如果您打算这样做,源代码会显示Random
类记录种子的值。所以你也可以直接提取它......以同样的方式。
(如何?搜索Q&amp; A,解释如何使用反射访问私有字段。)