- 浏览: 1666946 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (335)
- uml (11)
- java (318)
- python (11)
- socket (2)
- ant (1)
- data structures (58)
- algorithms (67)
- concurrency (16)
- multithreading (16)
- mysql (2)
- ubuntu (2)
- c语言 (1)
- lucene (0)
- elasticsearch (0)
- django (1)
- 读书 观点 (2)
- 读书 (4)
- 观点 (4)
- collections (8)
- nio (1)
- io (2)
- 系统集成 (1)
- activemq (2)
- restful (0)
- web service (0)
- HttpClient (1)
- serializable (0)
- annotation (1)
- jdbc (3)
- classloader (0)
- regular expression (1)
- jpa (4)
- jvm (0)
- reflection (1)
- commons-pool2 (2)
- javamail (1)
- velocity (1)
- mathematics (3)
- graph (13)
- LeetCode (159)
- scala (0)
- spring (24)
- maven (5)
- spring batch (1)
- quartz (2)
- IOC (2)
- ORM (3)
- hibernate (2)
- aop (4)
- redis (0)
- zookeeper (0)
- spring mvc (4)
- ELK (1)
- string (1)
- gradle (1)
- mybatis (5)
- docker (0)
- servlet (0)
- log4j2 (1)
- html (0)
- css (0)
最新评论
-
nucleus:
貌似是因为图片的路径是http的缘故:http://dl2.i ...
spring container 实现分析:BeanWrapper -
nucleus:
nucleus 写道BeanWrapper这一块相关的类结构如 ...
spring container 实现分析:BeanWrapper -
nucleus:
BeanWrapper这一块相关的类结构如下图:文中提到的上述 ...
spring container 实现分析:BeanWrapper -
leshy:
inventory.sort(Comparator.compa ...
java8 lambda表达式学习总结 -
Leisurez:
di1984HIT 写道xuexile~hahaha~
activemq的几种基本通信方式总结
在一次编程的过程中偶然碰到一个小问题,就是需要生成一个4位数的随机数,如果是一个不到4位大的数字,前面可以加0来显示。因为要求最后是一个4位的整数,不带小数点。当时就想到了几个办法:
一、 用Math.random()
当时就这么想到,Math.random()方法不正好可以生成[0, 1)之间的数字么?如果用这个数字乘以10000不就是一个从[0, 1000)之间的数字了么? 于是当时就想到了这么一段代码:
for(int i = 0; i < 10; i++) { double number = Math.random(); System.out.println(number * 10000); }
为了看看显示结果的情况,用了一个循环。
结果显示的运行结果如下:
372.4564939910557 3645.150576934125 6102.8559042871575 9953.00445315209 2063.1098637100063 6217.048150847877 5069.372886881975 8076.738641253838 1288.394893502075 14.324909511606032
很明显,在最初的设想中,有几个地方是没有考虑到的。
1. Math.random()生成的随机数不一定只有小数点后4位的。所以后面还是可能有多位,所以显示出来的结果有多个小树点。有人可能会想,如果我再把结果中的小数部分去掉呢?这并没有解决问题,其实也就是第二个问题。
2. 因为生成的数字可能足够小,哪怕乘了10000后还是个2位数字或者3位数字。这样的话,如果要凑成一个整4位的,还需要手工在前面补0.
那么,如果我们用这种很笨的办法来做的话,该怎么样呢?首先需要乘10000,然后将小数部分去掉,再判断生成的数字,1位的补3个0,2位的补2个0,3位的补1个0.
3. 还有一个问题就是,如果我们要将这个问题扩大到生成n位的随机数时,总不能后面去判断多少位,然后再去补0吧。而且,数字足够大的时候还可能会产生溢出的问题,int不够用了,估计还要用BigInteger。
看来,这个办法不是很好。实现起来也挺费劲。就为了实现这么点功能,还费这老鼻子劲,不值得。
二、逐位生成随机数
这个办法相对来说就会简单一点。我们如果利用生成整数的随机函数,然后一位一位的去生成的话。可能会简单一点。于是我们可以用一个这样的办法:
Random rnd = new Random(); public String getRandomNumber(int digCount) { StringBuilder sb = new StringBuilder(digCount); for(int i=0; i < digCount; i++) sb.append((char)('0' + rnd.nextInt(10))); return sb.toString(); }
我们用到了java.util.Random这个类。nextInt(n)这个方法可以返回一个从0到n的随机数。
通过这个办法,我们可以生成一个若干位的随机数,然后用一个字符串的方式来表示。当数字足够长的时候,也不用担心会溢出。
补充:
前面的生成随机数方法还存在着一个小的缺陷。在随机数生成的方法中,我们需要每次重复调用的时候生成的数字都是不一样的。这样就需要每次随机化的时候提供一个随机化的种子(seed)。比较常用的方式就是采用当前的时间。所以说一个比较完整的利用当前时间作为种子,再将需要随机化的范围指定的步骤才算是一个完整的过程。具体的代码如下:
import java.util.Random; import java.util.Date; class RandomizeNumber { public static void testDate() { Date date = new Date(); long timeMill = date.getTime(); System.out.println(timeMill); Random rand = new Random(timeMill); for(int i = 0; i < 20; i++) { System.out.println(rand.nextInt(50)); } } public static void main(String[] args) { testDate(); } }
如果我们每次运行这段代码,就会发现结果不一样,这样就可以保证足够随机化了。下面是一两次运行的结果:
frank@frank-PC:~/programcode/java$ java RandomizeNumber 1352364043027 42 16 19 24 46 45 32 36 3 44 40 20 40 13 14 40 6 46 20 1 frank@frank-PC:~/programcode/java$ java RandomizeNumber 1352364049226 44 38 16 30 9 14 5 47 41 32 17 47 32 35 10 19 42 26 28 42
发表评论
-
spring源代码分析:aop的实现
2018-10-03 23:32 687简介 在之前的文章里我们讨论过一些程序构建Pro ... -
java annotation基础
2018-06-30 16:41 833简介 之前有一篇简短的文章讨论过annotati ... -
spring源代码分析:annotation支持的实现
2018-09-03 23:31 2461简介 在之前的文章里,我们讨论了spring I ... -
spring container 实现分析:BeanFactory and ApplicationContext
2018-06-02 18:29 1406简介 在之前的文章里,我们讨论过作为spring ... -
spring aop: ProxyFactory
2018-04-30 16:45 788简介 在之前的文 ... -
日志与log4j2的配置和应用总结
2018-02-15 15:47 12195简介 通常我们在日常的应用开发中,日志起到一个非 ... -
Java servlet学习总结
2018-01-02 21:14 0简介 应用系统架构的演化(从CS到BS) ... -
spring container 实现分析:BeanWrapper
2018-02-19 18:10 1856简介 在之前的一篇文章里, 我们基于《Exper ... -
spring propertyeditor
2017-10-26 09:17 0pro spring 5 chapter 4, page ... -
spring bean life cycle
2018-02-25 13:30 871简介 在使用spring bean的过程中,有一个 ... -
spring container的设计与实现分析
2017-10-08 21:31 2656简介 在之前的一 ... -
jdbc数据访问的封装和演化
2017-09-16 17:00 2600简介 在使用传统jdbc的方式来访问数据的时候, ... -
Boyer Moore算法分析总结
2017-03-31 18:42 3481简介 在之前的文章里,对于字符串的搜索算法,我曾 ... -
mybatis学习总结:mybatis和spring, spring boot的集成
2017-03-04 18:07 2466简介 在前面的讨论里已经提到了mybatis的各种配置 ... -
mybatis学习总结:annotation与xml结合示例
2017-02-25 21:09 3649简介 在之前的文章里讨论过mybatis纯xml或者 ... -
mybatis学习总结:对象关系映射的xml配置实现
2017-02-19 23:03 4010简介 在之前的文章里已经讨论过mybatis的基本配 ... -
mybatis学习总结:annotation示例改进
2017-01-24 09:06 3386简介 在前一篇文 ... -
mybatis学习总结:基础示例
2017-01-21 23:30 844简介 mybatis是一个比较流行的ORM框架, ... -
gradle学习总结
2016-12-18 21:01 4531简介 Java的自动化构建工具比较多,从最开始的an ... -
String sort的几种方法
2016-10-16 23:07 2119简介 在之前的一 ...
相关推荐
利用随机数,hashset等实现随即生成若干位不重复的红球或蓝球的程序,供参考用,只是一些想法比较好,不足两位前面补零,hashset生成不重复的数列等
《Java语言程序设计实验》是以程序设计操作为主技能课程,它由若干个独立 实验项目构成,与相应理论课—《Java语言程序设计》配套,本课程目的是: (1) 加深学生对课堂讲授内容理解,从计算机语言基本概念、面向对象...
图论算法9.1 若干定义9.2 拓扑排序9.3 最短路径算法9.3.1 无权最短路径9.3.2 Dijkstra算法9.3.3 具有负边值的图9.3.4 无圈图9.3.5 所有点对最短路径9.3.6 最短路径的例子9.4 网络流问题9.5 最小生成树9.5.1 Prim算法...
图论算法9.1 若干定义9.2 拓扑排序9.3 最短路径算法9.3.1 无权最短路径9.3.2 Dijkstra算法9.3.3 具有负边值的图9.3.4 无圈图9.3.5 所有点对最短路径9.3.6 最短路径的例子9.4 网络流问题9.5 最小生成树9.5.1 Prim算法...
图论算法9.1 若干定义9.2 拓扑排序9.3 最短路径算法9.3.1 无权最短路径9.3.2 Dijkstra算法9.3.3 具有负边值的图9.3.4 无圈图9.3.5 所有点对最短路径9.3.6 最短路径的例子9.4 网络流问题9.5 最小生成树9.5.1 Prim算法...
中文名: 数据结构与算法分析_Java语言描述(第2版) 作者: 韦斯 译者: 冯舜玺 图书分类: 软件 资源格式: PDF 版本: 扫描版 出版社: 机械工业出版社 书号: ISBN:9787111231837 发行时间: 2009年01月01日 地区: 大陆 ...
9.3.4 无圈图 9.3.5 所有点对最短路径 9.3.6 最短路径的例子 9.4 网络流问题 9.5 最小生成树 9.5.1 prim算法 9.5.2 kruskal算法 9.6 深度优先搜索的应用 9.6.1 无向图 9.6.2 双连通性 9.6.3 ...
9.3.4 无圈图 9.3.5 所有点对最短路径 9.3.6 最短路径的例子 9.4 网络流问题 9.5 最小生成树 9.5.1 prim算法 9.5.2 kruskal算法 9.6 深度优先搜索的应用 9.6.1 无向图 9.6.2 双连通性 9.6.3 ...
9.1 若干定义 9.2 拓扑排序 9.3 最短路径算法 9.3.1 无权最短路径 9.3.2 Dijkstra算法 9.3.3 具有负边值的图 9.3.4 无圈图 9.3.5 所有顶点对最短路径 9.4 网络流问题 9.5 最小生成树 9.5.1 Prim...
另一类算法是对明文的一组位进行运算(即运算之前将明文分为若干组,然后分别对每一组进行运算,这些位组称为分组),相应的算法称为分组算法或分组密码。 AES 加密 RSA 加密 AES + RSA => 数据加密方案 RSA 等非...
BoundaryType定义了一个枚举,表示变量超出约束范围时为恢复到约束范围所采用的处理方式,分别是NONE(不处理),WRAP(加减若干整数个区间长度),BOUNCE(超出部分向区间内部折叠),STICK(取超出方向的最大限定值...