往期热门文章:
https://stackoverflow.com/questions/15182496/why-does-this-code-using-random-strings-print-hello-world
public class MainTest {
public static void main(String[] args) {
System.out.println(randomString(-229985452) + " " + randomString(-147909649));
}
public static String randomString(int i) {
Random ran = new Random(i);
StringBuilder sb = new StringBuilder();
while (true) {
int k = ran.nextInt(27);
if (k == 0)
break;
sb.append((char) ('`' + k));
}
return sb.toString();
}
}
高赞回答
public static void main(String[] args) {
randomString(-229985452);
System.out.println("------------");
randomString(-229985452);
}
private static void randomString(int i) {
Random ran = new Random(i);
System.out.println(ran.nextInt());
System.out.println(ran.nextInt());
System.out.println(ran.nextInt());
System.out.println(ran.nextInt());
System.out.println(ran.nextInt());
}
如果用相同的种子创建了两个 Random 的实例,并且对每个实例进行了相同的方法调用序列,那么它们将生成并返回相同的数字序列。
-229985452
就是相同的种子,而三次 nextInt()
调用,就是相同的调用序列。再看看问题
'`' + k
8 + 96 = 104 --> h
5 + 96 = 101 --> e
12 + 96 = 108 --> l
12 + 96 = 108 --> l
15 + 96 = 111 --> o
23 + 96 = 119 --> w
15 + 96 = 111 --> o
18 + 96 = 114 --> r
12 + 96 = 108 --> l
4 + 96 = 100 --> d
public static long generateSeed(String goal, long start, long finish) {
char[] input = goal.toCharArray();
char[] pool = new char[input.length];
label:
for (long seed = start; seed < finish; seed++) {
Random random = new Random(seed);
for (int i = 0; i < input.length; i++)
pool[i] = (char) (random.nextInt(27) + '`');
if (random.nextInt(27) == 0) {
for (int i = 0; i < input.length; i++) {
if (input[i] != pool[i])
continue label;
}
return seed;
}
}
throw new NoSuchElementException("Sorry :/");
}
只要时间足够漫长,猴子都能敲出一部《莎士比亚》。
源码
181783497276652981L
8682522807148012L
https://stackoverflow.com/questions/18092160/whats-with-181783497276652981-and-8682522807148012-in-random-java-7
https://bugs.openjdk.java.net/browse/JDK-8201634
往期热门文章:
1、我滴个乖乖,我复现了Spring的漏洞,害怕! 2、分布式锁用 Redis 还是 Zookeeper? 3、最适合晚上睡不着看的 8 个网站,建议收藏哦 4、String长度有限制吗? 5、14家互联网公司裁员(1-2月裁员清单) 6、Redis实现分布式锁的8大坑!切记! 7、请立即卸载这款 IDEA 插件! 8、Thread.sleep(0) 到底有什么用? 9、为什么不建议用try catch处理异常? 10、MySQL 为啥不能用 UUID 做主键?