做一个积极的人
编码, 改 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 工程师, 感兴趣的伙伴可以私聊!
来源: https://www.cnblogs.com/aflyun/p/10878652.html