大家好,我是伟伟。最近在stackoverflow上看到一段代码,怎么放。只是你乍一看一头雾水,等你明白了,你就跪下了!我带大家看看stackoverflow上这个问题是什么,然后引出这段代码:https://stackoverflow.com/que...问题很简单,就一句话:谁能给我解释一下:whythisparagraph代码用随机字符串打印helloworld?代码也很简单,我拿出来给大家运行一下:-147909649));}publicstaticStringrandomString(inti){Randomran=newRandom(i);StringBuildersb=newStringBuilder();while(true){intk=ran.nextInt(27);如果(k==0)中断;sb.append((char)('`'+k));}返回sb.toString();}}你也可以把上面的代码直接粘贴到你的运行环境中,运行一下,看看是否也输出了helloworld:请问你:代码就算给你了,你看到helloworld的时候是不是一头雾水第一次?高赞的回答高赞的回答也很简单,就两句话。我给你翻译一下,这哥们说:当我们调用Random的构造函数时,给了一个“种子”参数。例如在本例中:-229985452或-147909649。然后Random将从指定的种子值开始生成随机数。每个用相同种子构造的Random对象都会根据相同的模式产生数字。没太懂吧?没关系,我给你一段代码,你就会恍然大悟上一段是什么意思:publicstaticvoidmain(String[]args){randomString(-229985452);System.out.println("------------");randomString(-229985452);}privatestaticvoidrandomString(inti){Randomran=newRandom(i);System.out.println(ran.nextInt());.out.println(ran.nextInt());System.out.println(ran.nextInt());System.out.println(ran.nextInt());System.out.println(ran.nextInt());}在我的机器上运行这段代码的结果是这样的:如果你拿过来运行,你的运行结果一定是这样的。为什么是这样?答案就在Javadoc中:如果Random的两个实例是用相同的种子创建的,并且在每个实例上进行相同的方法调用序列,它们将生成并返回相同的数字序列。上面代码中,两个-229985452是同一个seed,三个nextInt()调用是同一个调用顺序。因此,它们生成并返回相同的、看似随机的数字。而我们在程序中正常的用法应该是这样的:在使用newRandom()的时候,是不会指定一个值的。我们都知道Random是一种伪随机算法,而在构建时指定seed参数的是一种更伪随机的算法。因为如果我能猜到你的种子,或者你的种子泄露了,那么理论上我就能猜到你的随机数生成序列。我已经在前面的代码中演示了这一点。再看看问题。前面稍微解释了“种子”的要点,我们再回到品一品的问题上,大概能看出一些端倪。主要看这个循环里面的代码。首先,nextInt(27)是有限制的,当前返回的数k必须是[0,27)之间的数。如果它返回0,则循环结束,如果不为零。然后进行类型转换。接下来是char类型转换。看到数字转char类型,应该会条件反射的想到ascii码:从ascii码表中,我们可以看出“96”就是这里的符号:所以,下面代码的取值范围是[96+1,96+26]:'`'+k为[97,122],对应ascii码的a-z。那么,让我带大家重新拆解一下上面的demo代码。首先newRandom(-229985452).nextInt(27)的前5个返回值如下:newRandom(-147909649).nextInt(27)的前5个返回值如下:所以,看ascii码表,可以看到对应的字母:8+96=104-->h5+96=101-->e12+96=108-->l12+96=108-->l15+96=111-->o23+96=119-->w15+96=111-->o18+96=114-->r12+96=108-->l4+96=100-->d现在,这一段的谜题代码之所以输出“helloworld”,是不是就像心中明镜透云雾见蓝天?看穿,不过是个把戏。然后这个问题下有个评论,让我看到了另一种打开方式:可以指定打印helloworld,所以理论上我也可以指定打印其他的词。例如,这位老人输入了一个短语:thequickbrownyfoxjumpsoveralazydog。如果按字面翻译,那就是“敏捷的棕色狐狸跳过一只懒狗”,这似乎是在胡说八道。但是,你知道的,我的英语水平比较高,一眼就看出这句话在这里绝对不容易。于是查了一下:果然是有故事的,属于把戏中的把戏。你看,在学习沙雕技法的同时,也顺便丰富了自己的英语技能,一举多得。为什么不在文末给我点个赞或者“在看”呢?看了这位兄弟的quickbrownfox例子,我有了新的想法。既然它输入了所有字母,难道我也不能输入我想要的特定短语吗?诸如我很好,谢谢你之类的事情。至于查找指定词对应种子的功能代码,在这个问题的回答中,“好人”已经帮我们写好了。我只是贴在这里,你也可以直接使用它:publicstaticlonggenerateSeed(Stringgoal,longstart,longfinish){char[]input=goal.toCharArray();char[]pool=newchar[输入。长度];label:for(longseed=start;seed
