本文经授权转载自漫话编程(ID:mhcoding)

周末,陪女朋友去电影院看了《复仇者联盟4:终局之战》,作为一个漫威粉三个小时看的是意犹未尽。出来之后,准备和女朋友聊一聊漫威这十年。

在《复仇者联盟》电影中,灭霸毕生都有一个目标,那就是通过抹除一半的生命来维持宇宙的平衡。

并且,灭霸还说,这个抹除过程是:随机性的、不夹私情、绝对公平、无论贵贱。


那么,到底什么是随机?他所谓的随机真的如他所说是不夹私情、绝对公平以及无论贵贱的吗?

随机性

随机性这个词是用来表达目的、动机、规则或一些非科学用法的可预测性的缺失。一个随机的过程是一个不定因子不断产生的重复过程。

提到随机性,不得不提的就是随机数,随机数在计算机应用中使用的比较广泛,最为熟知的便是在通信安全和现代密码学等领域中的应用。

随机数分为真随机数和伪随机数,我们程序中使用的基本都是伪随机数。

  • 真随机数,通过物理实验得出,比如掷钱币、骰子、转轮、使用电子元件的噪音、核裂变等。需要满足随机性、不可预测性、不可重现性。

  • 伪随机数,通过一定算法和种子得出。软件实现的是伪随机数。

只要这个随机数是由确定算法生成的,那就是伪随机。只能通过不断算法优化,使你的随机数更接近随机。

有限状态机不能产生真正的随机数的。所以,现代计算机中,无法通过一个纯算法来生成真正的随机数。无论是哪种语言,单纯的算法生成的数字都是伪随机数,都是由可确定的函数通过一个种子,产生的伪随机数。

为啥灭霸并不公平?

前面我们提到过,真随机数要满足随机性、不可预测性、不可重现性。

我们按照这三个性质逐一分析下,看看灭霸到底是不是公平的。

随机性

随机性,指的是不存在统计学偏差,是完全杂乱的数列。

复联3中,灭霸打了指响之后,复仇者联盟中存活和死亡的名单其实并不是随机的。其中很多对CP都是杀1留1的。如钢铁侠——蜘蛛侠、美队——冬兵、火箭浣熊——格鲁特、蚁人——黄蜂女等。


而且,还有一点就是,如果真的是随机性的话,那么灭霸自己也是有一定的概率会被抹除的,但是,他早就知道自己不会被抹除,并且已经制定好了退休计划。


并且,在复联3中,奇异博士用时间宝石和灭霸换了钢铁侠的生命,说明灭霸其实是选择性的进行抹除的。

可见,灭霸的指响抹除过程并不是随机的。

不可预测性

不可预测性,指的是不能从过去的数列推测出下一个出现的数。

这一点了解电影的朋友应该都知道,奇异博士曾经利用时间宝石穿越了时空,预测了未来,并看到了14000605种可能。

可见,灭霸的指响抹除过程并不是不可预测的。

不可重现性 

不可重现性,除非将数列本身保存下来,否则不能重现相同的数列。

在复联3中,钢铁侠问奇异博士,14000605种可能中,胜利的有多少种。奇异博士回答:1种。


在复联4中,最后奇异博士对钢铁侠比了下面这样一个手势。说明,他看到的那唯一一种胜利的可能要复现了。

可见,灭霸的指响抹除过程并不是不可复现的。

综上,灭霸的指响抹除过程不符合随机性、不可预测性以及不可复现性。所以,灭霸的指响抹除过程并不是真正的随机的。

通过现象来看,灭霸的抹除操作很可能只是通过简单的分层抽样实现的。简单操作过程如下:

  • 1、把需要特殊处理,不做抹除的人的DNA单独从所有物种的DNA库中识别出来,并保存到缓存中。

  • 2、根据不同的条件把DNA库中的所有生命体划分成若干区块,如地球人、阿斯加德人等。把他们的DNA信息保存到不同的数据库中。在遍历的过程中,如果遇到缓存中已有的数据,则跳过。

  • 3、再根据物种多样性,如性别、年龄段、职业等把同一个分库中的数据分别划分到不同的表中,保证每一张分表中都包含了完整的物种多样性。

  • 4、遍历所有数据库,按顺序的删除每个数据库中一半的分表。如地球人的数据库中共有1024张表,只保留512张即可。

  • 5、再把缓存中的数据同步到数据库中。

这样,在后面需要复活这些人的时候,只需要找到数据库的Binlog,把数据重新写入数据库就行了。

真随机数生成器

真正的随机数是使用物理现象产生而不是计算机程序产生的。生成随机数的设备我们称之为真随机数生成器。

这样的设备通常是基于一些能生成低等级、统计学随机的“噪声”信号的微观现象,如热力学噪声、光电效应和量子现象。

从某种程度上来说,基于经典热噪声的随机数芯片读取当前物理环境中的噪声,并据此获得随机数。这类装置相对于基于软件算法的实现,由于环境中的变量更多,因此更难预测。

然而在牛顿力学的框架下,即使影响随机数产生的变量非常多,但在每个变量的初始状态确定后,整个系统的运行状态及输出在原理上是可以预测的,因此这一类装置也是基于确定性的过程,只是某种更难预测的伪随机数。

但是,量子力学的发现从根本上改变了这一局面,因为其基本物理过程具有经典物理中所不具有的内禀随机性,从而可以制造出真正的随机数产生器。

据美国国家标准与技术研究院(NIST)官网消息,该机构研究人员在2018年4月出版的《自然》杂志上撰文指出,他们开发出一种新方法,可生成由量子力学保证的随机数字。新技术超越了此前获得随机数字的所有方法,得到了“真正的随机数字”,有助增强密码系统的安全性。(原文地址:https://www.nature.com/articles/s41586-018-0019-0.epdf )

NIST数学家彼特·比尔霍斯特进一步解释说:“诸如翻转硬币之类的情况似乎是随机的,但如果能看到硬币确切的下落路径,最终结果也是可以预测的。因此,很难保证给定经典来源真正不可预测。量子力学在产生随机性方面表现更好,量子随机是真正的随机,因为对处于‘叠加’状态的量子粒子进行测量,得到的结果基本上是不可预测的。”

在复联4中,也有很多和量子物理有关的知识,甚至最终可以扭转乾坤也是依靠的量子领域。漫威电影的宗旨可以高度概括成以下四句话:遇事不决,量子力学。 解释不通,穿越时空。 篇幅不够,平行宇宙。 定律不足,高维人族。

Java中的随机数生成器

Java中生成随机数还是比较简单的,Java提供了很多种API可以供开发者使用。

通过时间获取

在Java中,可以通过System.currentTimeMillis()来获取当前时间毫秒数:

final long l = System.currentTimeMillis();long l = System.currentTimeMillis();

若要获取指定范围的数字,只需要对数字进行取模就行了,如下方法可以获得0-99的随机数:

final long l = System.currentTimeMillis();
final int i = (int)( l % 100 );

Math.random()

通过Math.random()可以返回0(包含)到1(不包含)之间的double值。使用方法如下:

final double d = Math.random();double d = Math.random();

若要获取int类型的整数,只需要将上面的结果转行成int类型即可。比如,获取[0, 100)之间的int整数。方法如下:

final double d = Math.random();
final int i = (int)(d*100);

Random类 

Java提供的伪随机数发生器有java.util.Random类和java.util.concurrent.ThreadLocalRandom类。

Random类采用AtomicLong实现,保证多线程的线程安全性,但正如该类注释上说明的,多线程并发获取随机数时性能较差。

多线程环境中可以使用ThreadLocalRandom作为随机数发生器,ThreadLocalRandom采用了线程局部变量来改善性能,这样就可以使用long而不是AtomicLong,此外,ThreadLocalRandom还进行了字节填充,以避免伪共享。

如使用Random获取[0, 100)之间的int整数,方法如下:

Random random = new Random();
int i2 = random.nextInt(100);

强随机数发生器

强随机数发生器依赖于操作系统底层提供的随机事件。强随机数生成器的初始化速度和生成速度都较慢,而且由于需要一定的熵累积才能生成足够强度的随机数,所以可能会造成阻塞。熵累积通常来源于多个随机事件源,如敲击键盘的时间间隔,移动鼠标的距离与间隔,特定中断的时间间隔等。所以,只有在需要生成加密性强的随机数据的时候才用它。

Java提供的强随机数发生器是java.security.SecureRandom类,该类也是一个线程安全类,使用synchronize方法保证线程安全,但jdk并没有做出承诺在将来改变SecureRandom的线程安全性。因此,同Random一样,在高并发的多线程环境中可能会有性能问题。

这个锅,研发人员不背!!!

根据我的猜想。对于无限手套这个产品,产品经理最初的需求可能只是满足使用者的一个愿望而已,而几颗宝石就像是七龙珠一样,集齐之后打个指响就可以实现愿望。

开发者只是提供了一个可以满足愿望的API接口,参数是一个Callback,具体做什么事情,完全是使用者传进来的想法而已。就像灭霸要抹除一半的生命、绿巨人想要把被抹掉的人救回来、而钢铁侠只是想把坏人抹掉而已。

最后,Tony, Love You 3000 Times.

参考资料:

https://www.cnblogs.com/skywang12345/p/3341423.html

https://www.zhihu.com/question/277121161 http://www.nsfc.gov.cn/csc/20340/20343/30636/index.html

http://sh.people.com.cn/n2/2018/0413/c134768-31460133.html

【END】

作为码一代,想教码二代却无从下手:

听说少儿编程很火,可它有哪些好处呢?

孩子多大开始学习比较好呢?又该如何学习呢?

最新的编程教育政策又有哪些呢?

下面给大家介绍CSDN新成员:极客宝宝(ID:geek_baby)

戳他了解更多↓↓↓

 热 文 推 荐 

☞ 从Pixel 3a到Android Q,一份谷歌AI能力的“成绩单” | Google I/O全程回顾

Google I/O 2019 行纪 —— Google 要让 AI 消除偏见

GitHub:"围剿"Python计划!程序员:早知必有一战!你站谁?

☞她高中发明著名算法,保送清华姚班,斯坦福 AI 实验室负责人高徒 | 人物志

真正勇猛的程序员,敢于让鲁迅崩溃!

从Pixel 3a到Android Q,一份谷歌AI能力的“成绩单” | Google I/O全程回顾

没有一家公司可以逃避边缘计算 | 技术头条

☞20年无人能破的RSA算法发明人出的密码学难题, 竟被这个无名程序员3年破解!

☞她说:为啥程序员都特想要机械键盘?这答案我服!

点击阅读原文,输入关键词,即可搜索您想要的 CSDN 文章。

你点的每个“在看”,我都认真当成了喜欢

漫画:如何给女朋友解释灭霸的响指并不是真随机消灭半数宇宙人口的?相关推荐

  1. 灭霸的响指并不是真随机消灭半数宇宙人口的!

    周末,陪女朋友去电影院看了<复仇者联盟4:终局之战>,作为一个漫威粉三个小时看的是意犹未尽.出来之后,准备和女朋友聊一聊漫威这十年. 在<复仇者联盟>电影中,灭霸毕生都有一个目 ...

  2. 漫画:如何给女朋友解释灭霸的指响并不是真随机消灭半数宇宙人口的?

    本文经授权转载自漫话编程(ID:mhcoding) 周末,陪女朋友去电影院看了<复仇者联盟4:终局之战>,作为一个漫威粉三个小时看的是意犹未尽.出来之后,准备和女朋友聊一聊漫威这十年. 在 ...

  3. python灭霸的响指

    python灭霸的响指 闲来无事,做了个简单的snap小程序.可以在指定地点(C盘 )打响指,随机消灭一半的文件.自己试了试,感觉还蛮好玩.不多说了,我要赶紧抢救系统文件了. import os im ...

  4. 【漫画解析】程序员冒死给女朋友解释灭霸其实并不公平

    周末,陪男朋友去电影院看了<复仇者联盟4:终局之战>,作为一个漫威粉三个小时看的是意犹未尽.出来之后,准备和女朋友聊一聊漫威这十年. 在<复仇者联盟>电影中,灭霸毕生都有一个目 ...

  5. 漫画:给女朋友解释为什么随机播放歌曲并不随机

    本文经授权转载自漫话编程(ID:mhcoding) 2019程序员转型学什么? https://edu.csdn.net/topic/ai30?utm_source=csdn_bw 周末,开车带女朋友 ...

  6. 马斯克打了个响指,推特50%员工被裁....

    前几天Twitter被收购后要裁员的靴子终于落地了,这次裁员注定要记录史册,堪称惊天地泣鬼神. 我们一起看看马斯克给推特员工准备的裁员方案: 不知道大家看完后什么感想,反正洋哥看完后已经为马斯克拍案叫 ...

  7. 漫话:如何给女朋友解释什么是单例模式?

    本文转载于公众号:漫画编程 周末了,临近五一劳动节,女朋友还没有想好要去哪里玩,还在看着各种攻略.我则在旁边一边看书默默的心疼着我的钱包.突然女朋友开始发问: 什么是单例 单例模式,也叫单子模式,是一 ...

  8. 漫话:如何给女朋友解释什么是3PC?

    一顿愉快的小火锅之后,悠哉悠哉的回家了,于是只能开始新一轮的家庭科普了. 分布式一致性 幸好在<漫话:如何给女朋友解释什么是2PC(二阶段提交)?>中介绍过关于2PC的知识,要不然这事儿可 ...

  9. java 日期加一天_漫话:如何给女朋友解释为什么一到年底,部分网站就会出现日期混乱的现象?...

    2019年最后一天,在家里看着跨年晚会,享受着这一年最后一天的闲暇时光,女朋友在旁边玩手机.看了一会之后她突然问我一些很奇怪的问题. 于是我拿过他的手机,看到了下面这一幕: 这是微信官方出的公众号管理 ...

最新文章

  1. ISME: 中科院南京土壤所褚海燕组揭示关键菌群的生物多样性决定作物产量
  2. Android图片颜色比例,Android开发学习之路-图片颜色获取器开发(1)
  3. python面试题及答案-Python面试题10道(附答案)看完面试不愁了
  4. Java中sleep,wait,yield,join的区别
  5. python两个同切圆_求两个圆的交点
  6. access主窗体名词解释_ACCESS 父子窗体的语法介绍
  7. 设计模式系列——三个工厂模式(简单工厂模式,工厂方法模式,抽象工厂模式)...
  8. SLAM精度测评(绘制比较相机轨迹)- EVO
  9. SQL查找是否存在,别再count了
  10. android swf游戏下载工具,swf游戏模拟器高级版下载
  11. mysql好玩的代码_MySQL常用命令(1)
  12. 字模提取工具-PCtoLCD2002使用说明
  13. php 应用截图,PHP实现网页截图?
  14. 开发者应知的 如何“推销自己”?
  15. 浅谈Mediator仲裁者模式
  16. eplan 电箱布局_Eplan3D布局步骤解密
  17. 关于Synergy无法启动
  18. 360 2013校园招聘笔试题(含参考答案)
  19. Vue3 使用expose让父组件直接修改子组件的值
  20. 5G凭什么比4G快那么多?

热门文章

  1. 拖拽之路(五):自定义QListWidget实现美观的拖拽样式(拖拽不影响选中 + doAutoScroll)
  2. 【绘图】matlab 绘制窗口分布
  3. oracle从删库到跑路,Mysql入门二十小题(DBA老司机带你删库到跑路)2018.11.26
  4. python提高——类(私有化,封装、继承、多态)
  5. 力扣--349两个数组的交集I-II
  6. 剑指offer之统计数组中出现次数超过一半的数字
  7. 归并排序的java语言_归并排序 java语言
  8. 天正多条线段长度lisp下载_四年级数学上册基础题过关检测+12套思维题,下载给孩子测试!【有电子版】...
  9. macbook系统安装服务器,SVN-Mac安装服务器
  10. 固定于计算机主机,一种便于固定的计算机主机的制作方法