问题的引出
缺点1:如果n是一个比较小的2的乘方,经过一段相当短的周期之后,它产生的随机数序列将会重复。
缺点2:如果n不是2的乘方,那么平均起来,有些数比其他的数出现得更为频繁。如果n比较大,这个缺点就会非常明显。
运行之后打印出来的数接近于666 666。由random
方法产生的数字有2/3落在随机数取值范围的前半部分。
缺点3,在极少数情况下,它的失败是灾难性的,返回一个落在指定范围之外的数。
这个方式试图通过Math.abs
,将rnd.nextInt()
返回的值映射为一个非负整数int
。如果nextInt()
返回Integer.MAX_VALUE
,那么Math.abs
也会返回Integer.MAX_VALUE
,假设n
不是2的乘方,那么取模操作(%
)将返回一个负数。这肯定会使程序失败,而且这种失败很难重现。
解决办法
直接使用Random.nextInt(int)
方法。
使用库的好处
通过使用标准库,可以充分利用这些编写标准库的专家的知识,以及在你之前的其他人的使用经验。
不必浪费时间为那些与工作不大相关的问题提供特别的解决方案。应该把时间花在应用程序上,而不是底层的细节上。
标准库的性能会随着时间的推移而不断提高,无需你做任何努力。
标准库被当做工业标准来使用,提供这些标准库的组织有强烈的动机要使它们运行得更快。
标准库会随着时间的推移而增加新的功能。
使用标准库,使自己的代码融入主流,这样的代码更易读、更易维护、更易被大多数的开发人员重用。
保持与新版本的同步
在每个重要的发行版本中,都会有许多新的特性被加入到类库中,与这些新特性保持同步是值得的。
Collections Framework
统一的体系结构,用来表示和操作集合,允许它们对集合进行独立于实现细节的操作。
减轻了编程的负担,同时还提升了性能。
它考虑到了不相关的API之间的互操作性,减少了为设计和学习新的API所要付出的努力,并且鼓励软件重用。
java.util.concurrent
并发实用工具。
包含高级的并发工具来简化多线程的编程任务,还包含级别低的并发基本类型,允许专家们自己编写更高级的并发抽象。
总结
不要重复发明轮子。
类库代码的投入远远超过任何程序员在同样的功能上所能够给予的投入。