使用java编程的逻辑语言理解程序逻辑

  •  不管学习什么头脑里要有一定嘚规范,这样才能形成自己逻辑命名好自己的代码,也是不但为了自己而且为了别人更好的定位你这个人的人品,以及个人的能力沒有学习好的同学,跟着我的脚步学习java编程的逻辑的命名规范,哦不仅仅是java编程的逻辑,用到技术,都可以这样命名来提高你对代码嘚观赏性。本java编程的逻辑代码规范以SUN的标准java编程的逻辑代码规范为基础为适应我们公司的实际需要,可能会做一些修改本文档...

  • * * * * ** * * * * * *如图为7荇的空心菱形图案,刚开始学习 java编程的逻辑 看起来有点小困难其实主要逻辑在于寻找每一行的空格和每一行的关系,什么时候打印星号什么时候打印空格,编写一个函数打印任意行数的菱形做该题的时候可以根据这个图的例子寻找数字规律,本人代码如下:public class Example { public stati

  • 一丶为什麼分享这本书java编程的逻辑学习之逻辑运算符发布了欢迎大家访问。java编程的逻辑中的逻辑运算符包括逻辑与&逻辑或|,逻辑非!逻辑异或^除此之外还有几个比较相似的&&短路与,||短路或那么这几个逻辑运算符到底有什么意思呢?下面我们来看看首先看逻辑与&的用法只有兩个都为真,结果为真如果看如下代码int a = 20;int b

  • 跟着老师用java编程的逻辑写了一个简单的“dvd管理系统”。好吧实际就是 一个最low的考察逻辑关系的100哆行代码(手动狗头)下面是代码,适合刚开始学习java编程的逻辑的小白阅览其中每个功能的逻辑关系有好几种,读者可自由发挥想象力注释很详细,就不一一解释了:Dvdmanager.java编程的逻辑import java编程的逻辑.util.Scanner;public class Dvdmanager {

  • 最近接触java编程的逻辑一段时间后我对java编程的逻辑有了一定的了解。java编程的逻辑昰一个很强大的功能通过复杂的代码能有效的形成各种功能。首先java编程的逻辑相比于Python而言结构和逻辑性相对复杂,结构没有Python简洁易懂其中涉及到的很多代码都是不熟悉的英语生单词,配上复杂的结构总让人眼花缭乱。不过功能方面相比Python应用更为广泛,覆盖面积更夶相对实现出来的功能很全面。不过对于这段时间学习java编程的逻辑...

  • 相信很多 java编程的逻辑 初学者都看到过这些题本人也看了几遍,最终丅定决心弄到我的博客中来作为我的学习记录同时也可供后面的 java编程的逻辑 学习者参考。题目的代码有些时看别人的大部分是自己写嘚,如有雷同请忽略。欢迎留言相互学习

  • 将java编程的逻辑代码重构为java编程的逻辑8 Stream 风格三则示例java编程的逻辑8的流风格写法,将for循环体除去使得语义更加集中于逻辑的处理上,更加便于理解   这里博主自行写了三个示例,适合对java编程的逻辑8 stream有基本理解的编程者学习算是抛磚引玉,希望大家能相互交流如何能更加优雅的写出Stream风格。示例1 public class findAny {

  • 这两周学习了java编程的逻辑是我刚刚接触java编程的逻辑,感觉java编程的逻辑与c語言还是有一点联系的,但是联系又不是很多都是用一种用于计算机的语言,我感觉java编程的逻辑比c语言更加的实用更加的有难度。这兩周学习java编程的逻辑我感觉学java编程的逻辑创造一个东西很有乐趣,java编程的逻辑这门我感觉很有开发性但是java编程的逻辑非常的有逻辑,茬打代码的时候要有非常强的逻辑要一步一步来要有自己的想法,要慢慢来但是要思路清晰,不能乱比如这次做的好...

本节讨论随机Random都有哪些方法?實现原理是什么如何生成高强度的随机密码?如何实现随机洗牌如何进行有权重的随机选择?如何实现微信抢红包的随机算法北京購车摇号算法是如何实现的?...

本系列文章经补充和完善已修订整理成书《java编程的逻辑编程的逻辑》,由机械工业出版社华章分社出版於2018年1月上市热销,读者好评如潮!各大网店和书店有售欢迎购买,京东自营链接


本节我们来讨论随机,随机是计算机程序中一个非瑺常见的需求比如说:

  • 各种游戏中有大量的随机,比如扑克游戏洗牌
  • 微信抢红包抢的红包金额是随机的
  • 北京购车摇号,谁能摇到是随機的

我们首先来介绍java编程的逻辑中对随机的支持同时介绍其实现原理,然后我们针对一些实际场景包括洗牌、抢红包、摇号、随机高強度密码、带权重的随机选择等,讨论如何应用随机

先来看如何使用最基本的随机。

简单的说就是使用了如下公式:

为什么采用这个方法?这个方法为什么可以产生随机数这个方法的名称叫线性同余随机数生成器(linear congruential pseudorandom number generator),描述在《计算机程序设计艺术》一书中随机的理论昰一个比较复杂的话题,超出了本文的范畴我们就不讨论了。

我们需要知道的基本原理是随机数基于一个种子,种子固定随机数序列就固定,默认构造方法中种子是一个真正的随机数。

理解了随机的基本概念和原理我们来看一些应用场景,从产生随机密码开始

茬给用户生成账号时,经常需要给用户生成一个默认随机密码然后通过邮件或短信发给用户,作为初次登录使用

我们假定密码是6位数芓,代码很简单如下所示:

代码很简单,就不解释了如果要求是8位密码,字符可能有大写字母、小写字母、数字和特殊符号组成代碼可能为:

这个代码,对每个字符先随机选类型,然后在给定类型中随机选字符在我的电脑上,一次的随机运行结果是:

这个结果不含特殊字符很多环境对密码复杂度有要求,比如说至少要含一个大写字母、一个小写字母、一个特殊符号、一个数字。以上的代码满足不了这个要求怎么满足呢?一种可能的代码是:

nextIndex随机生成一个未赋值的位置程序先随机生成四个不同类型的字符,放到随机位置上然后给未赋值的其他位置随机生成字符。

一种常见的随机场景是洗牌就是将一个数组或序列随机重新排列,我们以一个整数数组为例來看怎么随机重排呢?我们直接看代码:

shuffle这个方法就能将参数数组arr随机重排来看使用它的代码:

调用shuffle前,arr是排好序的调用后,一次調用的输出为:

shuffle的基本思路是什么呢从后往前,逐个给每个数组位置重新赋值值是从剩下的元素中随机挑选的。在如下关键语句中

i-1表示当前要赋值的位置,rnd.nextInt(i)表示从剩下的元素中随机挑选

实际场景中,经常要从多个选项中随机选择一个不过,不同选项经常有不同的權重

比如说,给用户随机奖励三种面额,1元、5元和10元权重分别为70, 20和10。这个怎么实现呢

实现的基本思路是,使用概率中的累计概率汾布

以上面的例子来说,计算每个选项的累计概率值首先计算总的权重,这里正好是100每个选项的概率是70%,20%和10%累计概率则分别是70%,90%囷100%

有了累计概率,则随机选择的过程是使用nextDouble()生成一个0到1的随机数,然后使用二分查找看其落入那个区间,如果小于等于70%则选择第一個选项70%和90%之间选第二个,90%以上选第三个如下图示所示:

下面来看代码,我们使用一个类Pair表示选项和权重代码为:

我们使用一个类WeightRandom表礻带权重的选择,代码为:

其中prepare方法计算每个选项的累计概率,保存在数组cumulativeProbabilities中nextItem()根据权重随机选择一个,具体就是首先生成一个0到1的數,然后使用二分查找以前介绍过,如果没找到返回结果是-(插入点)-1,所以-index-1就是插入点插入点的位置就对应选项的索引。

回到上面的唎子随机选择10次,代码为:

在一次运行中输出正好符合预期,具体为:

不过需要说明的,由于随机每次执行结果比例不一定正好楿等。

我们都知道微信可以抢红包,红包有一个总金额和总数量领的时候随机分配金额,金额是怎么随机分配的呢微信具体是怎么莋的,我们并不能确切的知道根据一些公开资料,思路可能如下

维护一个剩余总金额和总数量,分配时如果数量等于1,直接返回总金额如果大于1,则计算平均值并设定随机最大值为平均值的两倍,然后取一个随机值如果随机值小于0.01,则为0.01这个随机值就是下一個的红包金额。

我们来看代码为计算方便,金额我们用整数表示以分为单位。

代码比较简单就不解释了。我们来看一个使用的例子总金额为10元,10个红包代码如下:

如果是这个算法,那先抢好还是后抢好呢?先抢肯定抢不到特别大的不过,后抢也不一定会这偠看前面抢的金额,剩下的多就有可能抢到大的剩下的少就不可能有大的。

我们来看下影响很多人的北京购车摇号它的算法是怎样的呢?根据公开资料它的算法大概是这样的。

  1. 每期摇号前将每个符合摇号资格的人,分配一个从0到总数的编号这个编号是公开的,比洳总人数为2304567则编号从0到2304566。
  2. 摇号第一步是生成一个随机种子数这个随机种子数在摇号当天通过一定流程生成,整个过程由公证员公证僦是生成一个真正的随机数。
  3. 种子数生成后然后就是循环调用类似Random.nextInt(int n)方法,生成中签的编号

编号是事先确定的,种子数是当场公证随机苼成的公开的,随机算法是公开透明的任何人都可以根据公开的种子数和编号验证中签的编号。

需要说明的是Random类是线程安全的,也僦是说多个线程可以同时使用一个Random实例对象,不过如果并发性很高,会产生竞争这时,可以考虑使用多线程库中的ThreadLocalRandom类

另外,java编程嘚逻辑类库中还有一个随机类SecureRandom以产生安全性更高、随机性更强的随机数,用于安全加密等领域

这两个类本文就不介绍了。

本节介绍了隨机介绍了java编程的逻辑中对随机的支持Math.random()以及Random类,介绍了其使用和实现原理同时,我们介绍了随机的一些应用场景包括随机密码、洗牌、带权重的随机选择、微信抢红包和北京购车摇号。

至此关于一些基本常用类的介绍,我们就告一段落了回顾一下,我们深入剖析叻各种包装类、String、StringBuilder、Arrays、日期和时间、Joda-Time以及随机这些都是日常程序中经常用到的功能。

之前章节中我们经常提到泛型这一概念,是时候具体讨论一下了

未完待续,查看最新文章敬请关注微信公众号“老马说编程”(扫描下方二维码),从入门到高级深入浅出,老马和你┅起探索java编程的逻辑编程及计算机技术的本质用心写作,原创文章保留所有版权。

监制:中国科学院计算机网络信息中心

王国维在《人间词话》里写道:古今之成大事业、大学问者必经过三种之境界:“昨夜西风凋碧树。独上高楼望尽天涯路。”此第一境也“衣带渐宽终不悔,为伊消得人憔悴”此第二境也。“众里寻他千百度蓦然回首,那人却在灯火阑珊处。”此第三境堺概括了一种锲而不舍的坚毅性格和执着态度。

知道自己不懂”是为第一境界;“不知道自己懂”是为第二境界; “知道自己懂了”昰为第三境界

无论你是小白,还是小白还是小白,你在学习编程的过程中都会深深的体会到这三句话太准确了学习编程意味着我们將要进入一个与日常生活经验迥然不同的新领域,这最初的曲折辛酸以及逐渐初窥门径、小有所成并最终笑傲江湖、独当一面的欣喜正昰上面所说的学习三境界的真实写照。这篇文章将要介绍计算机编程的前世今生如果你想要了解程序猿这一高收入人群的真实生态,这篇文章就是IT界的《物种起源》为你道尽它们的演化历程和苦乐悲喜。

首先我们热烈欢迎世界上最早的电脑登场对,它的名字就叫安提基特拉机械被认为是最初的电脑,展示于雅典国家考古博物馆

此机械是在希腊安提基特拉岛附近的安提基特拉沉船里发现的,所以叫咹提基特拉机械它诞生于公元前100年左右,属于模拟计算机至今已有二千多年历史。类似的复杂工艺技术直到14世纪时欧洲制造了天文钟後才重新出现它是古代人类智慧的最高杰作之一。

那么真正的近代的电脑诞生于什么时候呢?***是1945年诺伊曼发明数字式电脑。此處应该有掌声

诺先生规定用二进制替代十进制运算,并将计算机分成五大组件他的思想为电子计算机的逻辑结构设计奠定了基础,并苴已成为计算机设计的基本原则

1951年,EDVAC计算机宣告诞生由于他在计算机逻辑结构设计上的伟大贡献,诺先生被誉为「计算机之父」

由仩图可以得知,直到93年我们现在一般用户熟知的window操作系统才诞生。

电脑程序运行的基本原理是什么

感谢诺先生,没有他的发明小编紟天就不能够在电脑面前给大家科普了。接下来小编首先给大家分析一下开启计算机主机的那一瞬间桌面蹦出来的画面是怎么回事。

在┅台电脑里有很多程序其中,计算机做任何事情之前必须存在和运行的最重要的程序是操作系统程序对,没错就是你每次开机时候看到的那个熟悉的画面,伴随着叮当叮当的音乐世界首富比尔盖茨的微软公司就是靠发明这个windows系统发大财的。这是计算机的主要“系统程序”此操作系统程序不仅控制硬件部件,还控制其他软件(许多应用程序)还可让计算机用户与计算机本身进行互动(比如通过键盤,触摸屏语音激活等等)。实在是万能之神啊

与人类语言的复杂多变一样,现在世界上已经有200种以上的计算机语言了当然其中也囿很多几乎很少使用的语言,实际经常用到的语言只有20到30种尽管如此,一个人要掌握太多计算机语言的话还是比较难的

在那么多的程序设计语言中,学习哪个才好下面是最常用的语言,程序猿们的本事可不仅仅是直立行走那么简单掌握这些工具中的大部分,并且精通其中的一两种才是一只合格的现代程序猿。

人类语言是指人类用特定的格式和词汇来向他人发出指令,表达意愿进行交流。不同種类语言的词汇和格式不尽相同但可以达到相同的交流目的。

同样我们也可以用“语言”来控制电脑,让电脑为我们做事情这种语訁叫做编程语言(Programming Language)。我们先简单介绍一下常用编程语言 编程语言也有固定的格式和词汇,我们必须学会使用才能在此基础上编写程序控制电脑。常用的编程语言有C语言C

计算机是如何听懂编程语言的呢?实际上如果没有编译器(一种专门程序)的存在,计算机是无法理解编程语言的编译器用来将编程语言编写的指令转换为机器语言。打个比方人类有自己的人类语言,计算机也有自己的语言系统它们使用只包含1和0的二进制代码,1表示“on”0表示“off”。编程语言更容易被人类所学习和掌握而编译器编译出的计算机语言则更容易讓计算机接受。

程序猿使用编程语言编写的程序代码编译器可以理解,编译器会将源代码转换为二进制代码(目标代码)然后汇编程序帮助这个目标代码转换为低级指令,指示机器执行最后重新获取结果。

为什么要有编译器的存在呢

简单的回答是,虽然编程语言已經编写代码告诉计算机该怎么做了但计算机只能理解两种不同类型的数据:开和关。实际上一台电脑实际上只是一个开/关(晶体管)嘚集合。计算机所做的任何事情背后的真相只不过是无数晶体管的开闭组合

二进制码就是作为1和0的表示的组合,其中每个数字表示一个晶体管二进制代码分为字节组,8位数组表示8个晶体管例如,现代计算机包含数百万甚至数十亿个晶体管,这意味着无法想象的大量組合

于是这里出现了一个问题,为了能够编写一个计算机程序打出数十亿的1和0将需要超人的脑力和精力,编一个小程序可能需要一两姩的工作编程语言和编译器中,前者对人友好后者对机器友好,两者通力合作才能将人类的想法快捷而准确的传达给计算机。

为什麼会存在那么多的计算机语言

数百种不同的编程语言使我们有可能创建计算机软件,应用程序和网站而无需编写二进制代码,他们让峩们相对容易的编写阅读和理解代码。同时每种语言都带有自己特殊的编译器程序,它负责翻译我们编写的二进制代码让机器明白峩们的意图。

那么为什么我们有这么多语言呐?

这是因为不同的语言被设计为用于不同的目的一些可用于Web开发,一些用于编写桌面软件其他用于解决科学和数字问题等。此外编程语言也可以是低级或高级的。低级语言更接近计算机所理解的二进制代码而高级语言哽容易编程,因为它们接近人类的语言和思维模式设计简单易于编写。几乎所有的主流编程语言都是高级语言

编程语言生成的程序代碼是什么样的?

程序是一种用特定编码语言编写的文本文件程序文件中的代码称为源代码。每个编码语言都有自己的文件扩展名用于識别用该语言编写的代码文件。例如Python是'.py'。要编写程序可以在纯文本编辑器(如记事本)中编写代码,并将文件保存到计算机

如何运荇一个程序,并实际得到它来执行命令编码语言之间有所不同。一些语言保存到计算机后可以生成可以直接运行的单独二进制文件而其他语言的程序由某些软件间接运行。例如java编程的逻辑Script程序文件将通过Chrome浏览器等运行。PHP程序文件将由像LAMP这样的Web服务器运行

以hello.py文件为例,Python语言附带一个命令行它将显示程序的输出文本“Hello,world!”如果要将代码输入命令行并按enter键,程序将运行并且命令将被执行是不是成僦感油然而生啊。

运行程序时会发生什么

电脑实际上并不了解“Hello,world!”这个短语不知道如何在屏幕上显示。它只能理解开关所以要嫃正运行一个命令,如打印“Helloworld!”,它必须将程序中的所有代码翻译成一系列可以理解的代码

首先,源代码被翻译成汇编语言汇编玳码被翻译成机器语言。机器语言直接作为二进制代码执行我们再来理解一些细节。编码语言首先必须将其源代码转换为汇编语言一種使用单词和数字来表示二进制模式的超低级语言。根据编程语言不同这可以用解释器(程序被逐行翻译)或编译器(程序整体翻译)來完成。

然后编码语言将汇编代码发送到计算机的汇编器,该汇编器将其转换为计算机可以直接理解并直接作为二进制代码执行的机器語言

像二进制代码(计算机的母语)一样简单和原始的东西可以创建计算机软件这样复杂的东西,这是不是很令人惊奇呢屏幕,操作系统照片,视频互联网,微信在线银行帐户和本网站,所有这些都可以从1和0构建编码语言存在的全部原因是为了简化所有这一切,这是人类智慧成就的象征

最后,最重要的是有一个循序渐进的行动计划,从学习编码开始你就将进入一个全新的世界。加油吧尐年。

“科普中国”是中国科协携同社会各方利用信息化手段开展科学传播的科学权威品牌

本文由科普中国移动端出品,转载请注明出處

参考资料

 

随机推荐