做一个积极的人

编码、改bug、提升自己

我有一个乐园,面向编程,春暖花开!

在未来城市工作的的程序员小木,做了一个梦,梦到自己在塔鲁姆的街道上看到一个姑娘,这个姑娘从远处走向他,脸上带着微笑。让小木很是着迷,小木呆呆的望着姑娘从他身边走过,当他回过神来,发现姑娘已经走远,小木赶忙去追这位姑娘,突然天空中飘下一张字条,上面写着:

我一眼就看出你是Java程序员了,当你能用代码实现 520~1314 之间的随机整数,那么我会主动来找你的!

小木还很纳闷,为什么这个姑娘知道自己是一个程序员,姑娘难道是上天专门派来的吗 ?

小木同学,见下图:

小木很兴奋啊,终于我学的Java编程有用武之处了,这个比写CRUD和看项目留下的烂代码好很多啊,我写好了,姑娘就来找我了。小木大脑开始快速运转,脑神经之间相互发送消息,收集储存起来的数据。

几秒之后,小木想到了一个方法,在刚开始学习Java的时候学过一个 Math 类,它里面有一个生成随机数的方法random()。但是通过Math.random() 获取的随机数是[0,1)之间的double值。注:包含0,但1不包含!

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

double d = Math.random();
// [0, 1)
int love = (int) (d);
// randNumber 将被赋值为一个 MIN 和 MAX 范围内的随机数
int randNumber = rand.nextInt(MAX - MIN + 1) + MIN;

简单思考:要让值落在520~1314,那么

MAX : 1314

MIN: 520

因为 Math.random() 获取[0, 1),换算公式: (Math.random() * (MAX - MIN)) + MIN

根据公式照葫芦画瓢,小木很快就实现随机 520~1314 的代码了!

 double d = Math.random();
// [520, 1314)
int love = (int) (d * (1314-520)) + 520;

写完上面的代码后,小木想还是要检查检查,不能马虎大意,毕竟这关乎姑娘会不会来找自己。代码运行N多遍之后,520是包含了,但是1314 怎么也出现不了!小木很快意识到这问题很严重。没有1314 姑娘找他这件事肯定就泡汤了。重新看上面的换算公式, 小木发现公式有点问题,少了个 1 啊!

正确的公式是 : (Math.random() * (MAX - MIN + 1)) + MIN

 double d = Math.random();
// [520, 1315)
int love = (int) (d * (1314 - 520 + 1) + 520;

这样就完美一点了,随机数就可以包含1314,这样就可以[520,1314]了。

注: 为了方便阅读,括号内就没有直接写出运算后的值。

大脑还处在高速运转的小木,实现了上面的功能后,心想这么容易就能约到姑娘了,这是不是有点太简单了。于是又想还有没有其他办法还能实现此功能呢?又想到了有Math.random()。不是还有一个Random类嘛,和Random类一起的还有一个ThreadLocalRandom类。不管咋,我在用一种方法实现以下,好好表现一下自己也好!

使用Random获取[520, 1314]之间的int整数,Random 对象的nextInt(int) 方法,将生成 [0, int)之间随机取值的整数。根据上面的思路,实现代码如下:

Random random = new Random();
// [520,1315) == [520,1314]
int love = (random.nextInt(1314 - 520 + 1) + 520);

小木在上面代码下面备注了如下内容:

1、Random类采用AtomicLong实现,保证多线程的线程安全性,但是多线程并发获取随机数时性能较差。

2、ThreadLocalRandom就实现了,ThreadLocalRandom继承了Random。多线程环境中可以使用ThreadLocalRandom作为随机数生成器,ThreadLocalRandom采用了线程局部变量来改善性能。

最后当小木写完代码后,听到早晨的闹钟响了,美梦就这样被闹钟无情的敲碎了,醒来后,小木久久不能忘记梦中的姑娘,想着什么时候能够再次偶遇!

你期待小木和梦中姑娘的的再次相遇嘛,我真的还期待,说不定一段美妙的爱情火花就会擦出。

原文 用Java实现在【520,1314】之间生成随机整数的故事

用Java实现在【520,1314】之间生成随机整数的故事的更多相关文章

  1. 明明想在学校中请一些同学一起做一项问卷调查,为了实验的客观性,他先用计算机生成了N个1到1000之间的随机整数(N≤1000),对于其中重复的数字,只保留一个,把其余相同的数去掉,不同的数对应着不同的学生的学号。然后再把这些数从

    明明想在学校中请一些同学一起做一项问卷调查,为了实验的客观性,他先用计算机生成了N个1到1000之间的随机整数(N≤1000),对于其中重复的数字,只保留一个,把其余相同的数去掉,不同的数对应着不同的 ...

  2. 页面上有3个输入框:分别为max,min,num;三个按钮:分别为生成,排序,去重;在输入框输入三个数字后,先点击生成按钮,生成一个数组长度为num,值为max到min之间的随机整数点击排序,对当前数组进行排序,点击去重,对当前数组进行去重。 每次点击之后使结果显示在控制台

    <!DOCTYPE html> <html> <head> <!-- 页面上有3个输入框:分别为max,min,num:三个按钮:分别为生成,排序,去重: 在 ...

  3. 获取m,n之间的随机整数

    获取m,n之间的随机整数 代码去下:

  4. JS中,输出1-10之间的随机整数

    <script> document.write(parseInt(10*Math.random())); //输出0-10之间的随机整数 document.write(Math.floor ...

  5. python生成随机整数

    python生成随机不重复的整数,用random中的sample index = random.sample(range(0,10),10) 上面是生成不重复的10个从1~10的整数 python生成 ...

  6. python中生成随机整数(random模块)

    1.从一个序列中随机选取一个元素返回:   random.choice(sep)    2.用于将一个列表中的元素打乱   random.shuffle(sep)    3.在sep列表中随机选取k个 ...

  7. 要生成在[min,max]之间的随机整数,

    import java.util.Random; public class RandomTest { public static void main(String[] args) { int max= ...

  8. java生成随机整数

    1. 使用Random类的nextInt方法: Random rand = new Random(); rand.nextInt(max);, 此时输出[0,max),注意右边是开区间,如果需要设定最 ...

  9. js 取任意两个数之间的随机整数

    function getRandomInt(min, max) { min = Math.ceil(min); max = Math.floor(max); return Math.floor(Mat ...

随机推荐

  1. hdu 1711 KMP算法模板题

    题意:给你两个串,问你第二个串是从第一个串的什么位置開始全然匹配的? kmp裸题,复杂度O(n+m). 当一个字符串以0为起始下标时.next[i]能够描写叙述为"不为自身的最大首尾反复子串 ...

  2. Cacti监控Redis实现过程

    Cacti是一套基于PHP,MySQL,SNMP及RRDTool开发的网络流量监測图形分析工具.被广泛的用于对server的运维监控中,Cacti提供了一种插件式的管理.仅仅要按要求写好特定的模板,那 ...

  3. centOS的联网问题

    centOS连接了一个下午,没连上网络,隔了两天,又试了一下午才把网连上,一直查centOS的网络连接问题都搞不定,最后还是问了朋友怎么给虚拟机联网谈到虚拟网卡的问题.建议可以看看网络适配器,VMwa ...

  4. jeasyUI的treegrid批量删除多行

    看上去,javascript的变量类型,也可以分为值类型和引用类型.赋值操作中,值类型,各自独立,互不干涉:引用类型,指针而已,大家指向同一个对象. 为什么这样说呢? 我是从jeasyUI的treeg ...

  5. PNG vs. GIF vs. JPEG vs. SVG - When best to use?

    image - PNG vs. GIF vs. JPEG vs. SVG - When best to use? - Stack Overflow https://stackoverflow.com/ ...

  6. JMeter快捷键图标制作 去掉cmd命令窗口

    使用jmeter时: 如果使用默认的jmeter.bat启动的话,会出现一个CMD命令窗口之后再会启动jmeter工作界面 直接启用ApacheJMeter.jar文件即可跳过CMD命令窗口启动jme ...

  7. 关于移动平台的viewport

    viewport是用来设置移动平台上的网页宽度,写device-width比较好,不然会和设备上不一样 在使用device-width之后,图片资源最好使用百分比布局,进行自动缩放. 文字大小是一样的 ...

  8. mybatis写当天 当月的数据 时间段数据

    1 数据库字段pk_time(Varchar) 当天的数据 SELECT * FROM 表 WHERE date(fk_time) = curdate(); 当月的数据 SELECT *FROM 表 ...

  9. Ural 1158. Censored! 有限状态自动机+DP+大整数

    Ural1158 看上去很困难的一道题. 原文地址 http://blog.csdn.net/prolightsfxjh/article/details/54729646 题意:给出n个不同的字符,用 ...

  10. Java IO --ByteArrayOutputStream (六)***

    Java提供了很丰富的io接口,已经可以满足我们大部分读取数据的需求,这个在C读取数据需要自己定义缓冲区数组大小,而且要小心翼翼的防止缓冲区溢出的情况相当不同.一般情况下我们读取的数据都是直接读取成为 ...