下面的打印语句将打印“hello world”。有人能解释一下吗?

System.out.println(randomString(-229985452) + " " + randomString(-147909649));

randomString()如下所示:

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();
}

当前回答

事实上,大多数随机数生成器都是“伪随机”的。它们是线性同余生成器,或LCG(http://en.wikipedia.org/wiki/Linear_congruential_generator)

给定固定的种子,LCG是非常可预测的。基本上,使用给你第一个字母的种子,然后编写一个应用程序,继续生成下一个int(char),直到你命中目标字符串中的下一个字母,并记下你需要调用LCG的次数。继续,直到生成每个字母。

其他回答

这都是关于输入种子的。相同的种子产生相同的结果时间。即使你一次又一次地重新运行你的程序,它的输出也是一样的。

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());

}

输出

-755142161
-1073255141
-369383326
1592674620
-1524828502
------------
-755142161
-1073255141
-369383326
1592674620
-1524828502

当java.util.Random的实例使用特定的种子参数(在本例中为-22985452或-147090649)构建时,它遵循从该种子值开始的随机数生成算法。

使用相同种子构建的每个随机数每次都会生成相同的数字模式。

Random始终返回相同的序列。它用于重排数组和其他排列操作。

要获得不同的序列,需要在某个位置初始化序列,称为“种子”。

randomSting在“随机”序列的i位置(种子=-22985452)获得随机数。然后将ASCII码用于种子位置之后的序列中的下一个27个字符,直到该值等于0。这将返回“hello”。同样的操作也适用于“世界”。

我认为该代码不适用于任何其他单词。编程的人非常了解随机序列。

这是非常棒的极客代码!

事实上,大多数随机数生成器都是“伪随机”的。它们是线性同余生成器,或LCG(http://en.wikipedia.org/wiki/Linear_congruential_generator)

给定固定的种子,LCG是非常可预测的。基本上,使用给你第一个字母的种子,然后编写一个应用程序,继续生成下一个int(char),直到你命中目标字符串中的下一个字母,并记下你需要调用LCG的次数。继续,直到生成每个字母。

原理是用相同的种子构建的随机类每次都会生成相同的数字模式。