初看一脸问号,看懂直接跪下! (中)

简介: 初看一脸问号,看懂直接跪下! (中)

然后这个问题下面还有个评论,让我看到了另外一种打开方式:


image.png

你能指定打印出 hello world,那么理论上我也能指定打出其他的单词。

比如这个老哥就打了一个短语:the quick browny fox jumps over a lazy dog.

如果从字面上直译过来,那么就是“敏捷的棕色狐狸跨过懒狗”,好像也是狗屁不通的样子。

但是,你知道的,我的 English 水平是比较 high 的,一眼就看出这个短语在这里肯定不简单。

于是查了一下:

image.png

image.png

你看学沙雕技术的时候还顺便丰富了自己的英语技能,一举多得,这一会还不得在文末给我点个赞、点个“在看”啥的?

看完这个老哥的 quick brown fox 示例之后,我又有一点新想法了。

既然它能把所有的字母都打出来,那我是不是也能把我想要的特定的短语也打出来呢?

比如 i am fine thank you and you 这样的东西。

而查找指定单词对应的 seed 这样的功能的代码,在这个问题的回答中,已经有“好事之人”帮我们写出来了。

我就直接粘过来,你也可以直接拿去就用:

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 :/");
}

那么我要找前面提到的短语,就很简单了:

image.png

而且运行的时候我明显感觉到,在搜索“thank”这个单词的时候,花了很多时间。

为什么?

我给你讲一个故事啊,只有一句话,你肯定听过:

只要时间足够漫长,猴子都能敲出一部《莎士比亚》。

我们这里 generateSeed 方法,就相当于这个猴子。而 thank 这个单词,就是《莎士比亚》。

在 generateSeed 方法里面,通过 26 个字母不断的排列组合,总是能排列出 “thank” 的,只是时间长短而已。

单词越长,需要的时间就越长。

比如我来个 congratulations,这么长的单词,我从 00:05 分,跑了 23 个小时都还没跑出来:

image.png



源码


你以为我要带你读源码?

不是的,我主要带你吃瓜。

首先,看一下的 Random 无参构造函数:

image.png

好家伙,原来也是套个了个“无参”的壳而已,实际上还是自己搞了一个 seed,然后调用了有参构造方法。

只是它构建的时候加入了“System.nanoTime()”这个变量,让 seed 看起来随机了一点而已。

等等,前面不是还有一个“seedUniquifier”方法吗?

这个方法是这样的:

image.png

好家伙,看到第一眼的时候我头都大了,这里面有两个“魔法数”啊:

181783497276652981L

8682522807148012L

这玩意也看不懂啊?

遇事不决,stackoverflow。

一搜就能找到这个地方:

https://stackoverflow.com/questions/18092160/whats-with-181783497276652981-and-8682522807148012-in-random-java-7


image.png

论文中提到的数是这样的:

微信图片_20220429090100.png

目录
相关文章
|
5月前
|
算法 搜索推荐 程序员
第六十二练 字符串匹配 - 模糊匹配
第六十二练 字符串匹配 - 模糊匹配
52 1
|
数据采集 XML 编解码
正则表达式学废了?xpath来救!
正则表达式学废了?xpath来救!
69 0
|
5月前
|
算法 搜索推荐 程序员
第三十八练 括号匹配问题
第三十八练 括号匹配问题
48 0
|
Java
Java正则表达式(一看就懂)(下)
4.正则表达式-参考附录 参照帮助文档,在 Pattern 类中有正则表达式的的规则定义,正则表达式中明确区分大小写字母。我们 来学习语法规则。 4.1规则
93 0
|
Java 数据安全/隐私保护 Python
Java正则表达式(一看就懂)(上)
看了热榜正则表达式都上榜了目前正则表达式榜一是Python的 经过这几天呕心沥血不眠不休 终于今天Java的正则表达式它来了 还有练习题 耗时9981个小时 都是干货 赶紧收藏起来!!!!
87 0
|
前端开发 JavaScript 数据安全/隐私保护
关于正则表达式,小黄人有话要说!!!
本文将带你逐步学习正则表达式的基础知识和高级技巧,从基本的元字符到实用的正则表达式示例,让你轻松掌握这一重要的编程技能。无论你是初学者还是有一定经验的开发者,这篇文章都能帮助你更好地理解和应用正则表达式。
114 0
关于正则表达式,小黄人有话要说!!!
|
数据采集 JavaScript 计算机视觉
正则什么的,你让我写,我会难受,你让我用,真香!
正则什么的,你让我写,我会难受,你让我用,真香!
|
数据可视化 计算机视觉
滚蛋吧,正则表达式!
滚蛋吧,正则表达式!
619 1
滚蛋吧,正则表达式!
|
JSON API 数据格式
一日一技:难以置信,还有人不知道反斜杠和引号的关系
一日一技:难以置信,还有人不知道反斜杠和引号的关系
258 0
一日一技:难以置信,还有人不知道反斜杠和引号的关系
|
Java Python
Java正则表达式(一看就懂)
Java正则表达式(一看就懂)
222 0
Java正则表达式(一看就懂)