Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >为什么这段代码输出的是”Hello World”

为什么这段代码输出的是”Hello World”

作者头像
哲洛不闹
发布于 2018-09-19 02:42:09
发布于 2018-09-19 02:42:09
1.1K00
代码可运行
举报
文章被收录于专栏:java一日一条java一日一条
运行总次数:0
代码可运行

Stackoverlfow.com上有一篇有趣的讨论帖:

在这篇帖子里提到了如下的程序:

明明是在程序里使用了java.util.Ramdom()函数产生随机数,为什么每次打出的结果都是Hello world? 各位程序员,你们怎么看?请务必要独立思考后再看下面的内容哦~

—————–独立思考的分割线—————————

OK,假如你通过独立思考了以后有了答案,那么可以参照一下下面的各种理解,这些都是来自stackoverflow对此问题的回复。

首先看一下这个程序的工作原理:

通过这句命令首先得到的六个数是:

8 5 12 12 15 0

然后,通过new Random(-147909649).nextInt(27)得到的6个数是:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
23 15 18 12 4 0

这样一来,根据:sb.append((char) (‘`’+n)); 得到:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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

整个程序的执行就是这样。

关于这个程序的运行原理的解释,最置顶的一个回复如下:

“如果java.util.Random是被一个具体的数字做为“随机数种子”而实例化(在本例中是-229985452和-147909649),那么该实例就会以这个随机数种子作为随机算法产生随机数的基础。

使用同样的种子实例化的Random对象,每次运行时将会遵循同一种模式,产生同样的序列。” 这就是为什么每次运行该程序都会产生同样的结果的原理啦~

当然,关于这个话题,高手林立的Stackoverflow上是不缺乏懂行的专家和见解的。其实对于这个帖子本身,很快就有人论坛上提出了,这不是一个新鲜的问题,之前的某个帖子已经很详细地说明了原理:

参见:stackoverflow.com/questions/8044570/why-does-the-use-of-random-with-a-hardcoded-seed-always-produce-the-same-results

还有的人就非常精辟地指出了,这是计算机所谓的“伪随机数”问题(详细见扩展阅读),更有部分Geek的回复者从计算机理论和概率论的角度说明了,应该如何找到这些神奇的“随机数种子”。能够把这么一个原意为搞笑的帖子发展到理论的高度~,相信这应该也是计算机科学家的境界和觉悟了吧!

扩展阅读:计算机伪随机数问题

随机数在计算机科学和计算机应用中都扮演非常重要的角色(例如通信、安全、密码等方面)。但是,由于计算机本身的结构和原理,实际上是无法产生出所谓的“绝对随机数”的。也就是说,计算机所产生的随机数,实际上是有某种规律或者模式的“伪随机数”(Pseudo random number)。

如何用计算机程序产生高质量随机数,这是计算机理论科学中的一个非常重要的课题。尤其是在复杂的计算环境下的高质量随机数的产生,需要牵涉到非常高深的计算科学和数学方面的理论研究。

在计算机随机数产生的理论研究上,美籍华人姚期智(目前任职于清华大学)是世界顶尖的专家。正是因为他在计算理论和伪随机数产生方面多项贡献,于2000年获得了ACM图灵奖,这也是计算机科学领域的最高奖项。

英文来源:stackoverflow 中文编译:importnew-黄小非

译文链接:http://www.importnew.com/3251.html

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2015-10-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 java一日一条 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
初看一脸懵逼,看懂直接跪下!
上面的代码你也可以直接粘贴到你的运行环境中跑一下,看看是不是也输出的 hello world:
why技术
2022/05/25
2960
初看一脸懵逼,看懂直接跪下!
C/C++中随机函数rand()和srand()的用法「建议收藏」
rand()和srand()要一起使用,其中srand()用来初始化随机数种子,rand()用来产生随机数。
全栈程序员站长
2022/08/11
2.2K0
7个Java问题在StackOverflow上的最佳答案
对开发人员来说, StackOverflow就像一个金矿。对具体的问题,它能帮我们找到最有用的答案,并且我们也可以从上面学习新的知识。
烂猪皮
2018/08/03
6480
7个Java问题在StackOverflow上的最佳答案
PLC如何产生一个随机数(含代码)
在剑指工控群里,一群友问PLC如何产生随机数,曾记得除了三菱PLC之外其他常规品牌好像没有提供专门的随机函数。这里就整理两种产生随机数的方法:
剑指工控
2021/11/09
3.4K0
神奇,教你用随机数打印hello world
下面是一段随机数程序。 public static void main(String[] args) { System.out.println(randomString(-229985452) + " " + randomString(-147909649)); } public static String randomString(int seed) { Random ran = new Random(seed); StringBuilder sb = new StringB
Java技术栈
2018/03/30
8440
神奇,教你用随机数打印hello world
一张通往计算机世界的地图
今天为大家呈现一张通往“计算机世界”的地图,希望通过本文能够带你进入计算机科学领域。
鲜枣课堂
2019/07/19
9190
Python生成随机数的一个标准库-random
Random库Python中用于生成随机数的一个标准库。计算机没有办法产生真正的随机数,但它可以产生伪随机数。
Python学习者
2023/05/09
3160
写给开发人员的实用密码学 - 随机数
上一篇文章中介绍了消息验证码,这篇文章咱们来聊聊随机数。随机数看起来是一个很简单的概念,不论哪种编程语言都提供了简单的生成随机数的方法,有必要单独写一篇文章么?
云水木石
2021/01/12
1.9K0
rand(),srand()产生随机数
      rand()函数可以用来产生随机数,但是这不是真真意义上的随机数,是一个伪随机数,是根据一个数,我们可以称它为种子,为基准以某个递推公式推算出来的一系数,当这系列数很大的时候,就符合正态公布,从而相当于产生了随机数,但这不是真正的随机数,当计算机正常开机后,这个种子的值是定了的,除非你破坏了系统,为了改变这个种子的值,C提供了 srand()函数,它的原形是void srand( int a).       初始化随机产生器既rand()函数的初始值,即使把种子的值改成a; 从这你可以看到通过
猿人谷
2018/01/17
3K0
图同构在P/NP问题上重大突破,计算机理论10年最重要成果
芝加哥科学家 László Babai 发明了一种方法,能够用多项式的时间判断两个网络是否相同。 麻省理工学院的计算机科学家 Scott Aaronson 把它称为计算机理论领域十年以来最重要的成果。 斯坦福大学的计算机科学家 Ryan Williams 说,他一开始以为是个玩笑,特地查了下那天是不是愚人节。他认为新的算法有可能是过去十多年计算机科学理论最重要的突破。 图同构在 P/NP 问题的突破,能解决很多计算机的实际问题,毕竟很多任务都都可以归结为网络是否相同上。 图同构中即使很小的进步都会掀起
新智元
2018/03/13
14.2K0
图同构在P/NP问题上重大突破,计算机理论10年最重要成果
随机数是真是假你说了算???
几乎所有编程语言中都提供了"生成一个随机数"的方法,也就是调用这个方法会生成一个数,我们事先也不知道它生成什么数。比如在.Net中编写下面的代码:
张哥编程
2024/12/19
560
随机数是真是假你说了算???
责任·创新·奉献 — CCF与腾讯共同为何新贵院士、周巢尘院士颁发终身成就奖
导语 1月19日,2018年度“中国计算机学会(CCF)颁奖大会”在北京隆重举行。本届颁奖会以“责任•创新•奉献”为主题,颁发了CCF终身成就奖、CCF夏培肃奖、CCF杰出贡献奖、CCF卓越服务奖、CCF杰出教育奖、CCF计算机企业家奖、CCF杰出工程师奖、CCF优秀博士学位论文奖等8个奖项。来自海内外的企事业单位科研院所的300余位嘉宾应邀见证这辉煌的时刻。 CCF副理事长、腾讯公司副总裁王巨宏女士代表腾讯与CCF名誉理事长李国杰院士共同为中国人民解放军军事科学院系统工程研究院系统总体研究所研究员、中
腾讯高校合作
2019/01/22
8560
责任·创新·奉献 — CCF与腾讯共同为何新贵院士、周巢尘院士颁发终身成就奖
【说站】python中的随机数种子seed()用法说明
这篇文章主要介绍了python中的随机数种子seed()用法说明,具有很好的参考价值,希望对大家有所帮助。
很酷的站长
2022/11/24
2K0
【说站】python中的随机数种子seed()用法说明
Joern In RealWorld (2) - Jumpserver随机数种子泄露导致账户劫持漏洞(CVE-2023-42820)
Jumpserver是一个开源的django架构的堡垒机系统,由lawliet & zhiniang peng(@edwardzpeng) with Sangfor在上个月报送了这个漏洞
LoRexxar
2023/10/27
6290
Joern In RealWorld (2) - Jumpserver随机数种子泄露导致账户劫持漏洞(CVE-2023-42820)
StackOverflow:7个你从未见过的Java问题最佳答案
对开发人员来说, StackOverflow就像一个金矿。对具体的问题,它能帮我们找到最有用的答案,并且我们也可以从上面学习新的知识。
哲洛不闹
2018/09/18
4230
StackOverflow:7个你从未见过的Java问题最佳答案
Java伪随机数打印任意的字母数字
有这么一段代码,虽然看上去是使用Random类,但可以发现不管怎么运行,结果都是一样的。
sgr997
2022/11/22
9380
学界 | 姚期智到底有多牛?细数中国唯一图灵奖得主在三大领域的学术造诣
提起姚期智,大部分人的第一反应会想到图灵奖。如今作为国内第一名也是唯一一名图灵奖获得者,姚期智自 2011 年起担任清华交叉信息研究院院长,为培养国内优秀人才做出了巨大贡献。今天,AI科技评论就和大家
AI科技评论
2018/03/12
2K0
学界 | 姚期智到底有多牛?细数中国唯一图灵奖得主在三大领域的学术造诣
Python 伪随机数:random库的使用
(圆周率)是一个无理数,即无限不循环小数。精确求解圆周率 是几何学、物理学和很多工程学科的关键。
小嗷犬
2022/11/15
1.3K0
Python 伪随机数:random库的使用
Python 随机(Random)模块的不可预测之美
计算机通过硬件技术摸拟现实世界中这种物理现象所生成的随机数,我们称其为真随机数。 这样的随机数生成器叫做物理性随机数生成器。生成真随机数对计算机的硬件技术要求较高。
一枚大果壳
2022/08/23
7870
Python 随机(Random)模块的不可预测之美
理论计算机顶会FOCS 2021奖项揭晓!姚期智获时间检验奖,MIT毛啸获最佳学生论文奖
FOCS由IEEE计算机学会的计算机数学基础专委会提供资助,是计算机科学领域最顶级的国际会议,在整个理论计算机科学领域享有崇高的声望,并被公认属于难度最高的会议之一,与ACM计算理论年会(STOC)并称理论计算机科学两大顶会。
AI科技评论
2021/12/24
9810
理论计算机顶会FOCS 2021奖项揭晓!姚期智获时间检验奖,MIT毛啸获最佳学生论文奖
推荐阅读
相关推荐
初看一脸懵逼,看懂直接跪下!
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验