第47条:了解和使用类库

假设希望产生位于0到某个上界之间的随机整数。可能会这样编写:

private static final Random rnd = new Random();
static int random(int n){
    return Math.abs(rnd.nextInt()) % n;
}

测试随机性:

public static void main(String[] args) {
    int n = 2 * (Integer.MAX_VALUE / 3);
    int low = 0;
    for(int i=0; i < 1000000; i++)
        if(random(n) < n/2)
            low++;
}   

结果接近于666666,由random方法产生的数字有2/3在取值范围的前半部分。

编写一个随机数生成的方法需要了解关于随机数生成器、数论和2的求补算法的相关知识。

现有的类库提供随机数生成的方法,不需要自己来做这样的工作,Random.nextInt(int)就实现产生0到某个上界的随机数功能。

标准的类库经过测试,而且一旦发现缺陷,会在下个版本修正,程序员如果不持续关注,可能连方法实现细节被修改过也不会发现。

时间: 2024-08-09 21:50:22

第47条:了解和使用类库的相关文章

thinkphp条用函数与类库

手册上说的很冗余,没看懂,下面简单的讲一下具体用法. 函数调用: lib公共函数库叫 common.php App/common/common.php 分组模块下的公共函数库叫 function.php App/Modules/Admin/common/function.php 类库调用: class IndexAction extends Action{ public function index(){ // 调用“扩展基类库” ThinkPHP/Extend/Library/ORG/Util

[Effective JavaScript 笔记]第47条:绝不要在Object.prototype中增加可枚举的属性

之前的几条都不断地重复着for...in循环,它便利好用,但又容易被原型污染.for...in循环最常见的用法是枚举字典中的元素.这里就是从侧面提出不要在共享的Object.prototype中增加可枚举的属性.这就导致,我们在开发的时候,不能在Object.prototype中添加有用的方法.如,我们想增加一个产生对象属性名数组的allKeys方法将会怎么样? Object.prototype.allKeys=function(){ var res=[]; for(var key in thi

java-常见编码坏习惯

代码质量实战Any fool can write code that a computer can understand. Good programmerswrite code that humans can understand. -- Martin FowlerThe only valid measurement of Code Quality: WTFs/minute参考资料:1.<代码大全>2.<重构:改善既有代码的设计>3.<代码整洁之道>3.<Effe

java编程的78条黄金法则

创建和销毁对象 1.考虑用静态工厂方法(返回类的实例的静态方法)代替构造器2.遇到多个构造器参数时要考虑用构造器3.用私有构造器或者枚举类型强化Singleton属性4.通过私有构造器强化不可实例化的能力5.避免创建不必要的对象6.消除过期的对象引用7.避免使用终结(final)方法 对于所有对象都通用的方法 8.覆盖equals时请遵守通用约定9.覆盖equals时总要覆盖hashCode10.始终要覆盖toString11.谨慎地覆盖clone12.考虑实现Comparable接口 类和接口

MfC 进度条控件

1.进度条 主要用来进行数据读写.文件拷贝和磁盘格式等操作时的工作进度提示情况,如安装程序等,伴随工作进度的进展,进度条的矩形区域从左到右利用当前活动窗体标题条的颜色来不断填充. 2.进度条控制在MFC类库中的封装类为CProgressCtrl,通常仅作为输出类控制,所以其操作主要是设置进度条的范围和当前位置,并不断地更新当前位置.进度条的范围用来表示整个操作过程的时间长度,当前位置表示完毕情况的当前时刻. SetRange()函数用来设置范围,初始范围为0-100, SetPos()函数用来设

Effective Java总结的78条

1.考虑用静态工厂方法代替构造器 2.遇到多个构造器参数时要考虑用构造器 3.用私有构造器或者枚举类型强化Singleton属性 4.通过私有构造器强化不可实例化的能力 5.避免创建不必要的对象 6.消除过期的对象引用 7.避免使用finalizer方法 8.重写equals方法时遵守通用约定 9.重写equals时总要重写hashCode 10.始终要重写toString 11.谨慎的重写clone 12.考虑实现Comparable接口 13.使类和成员的可访问性最小化 14.在共有类中使用

[Effective Java]第八章 通用程序设计

第八章      通用程序设计 45.      将局部变量的作用域最小化 将局部变量的作用域最小化,可以增强代码的可读性和可维护性,并降低出错的可能性. 要使用局部变量的作用域最小化,最有力的方法就是在第一次使用它的地方才声明,不要过早的声明. 局部变量的作用域从它被声明的点开始扩展,一直到外围块的结束外.如果变量是在“使用它的块”之外被声明有,当程序退出该块之后,该变量仍是可见的,如果它在目标使用区之前或之后意外使用,将可能引发意外错误. 几乎每个局部变量的声明都应该包含一个初始化表达式,如

【电子书】Effective Java中文版下载

下载地址: 点击打开链接 (需要资源0分的联系我~) <Effective Java中文版(第2版)>主要内容:在Java编程中78条极具实用价值的经验规则,这些经验规则涵盖了大多数开发人员每天所面临的问题的解决方案.通过对Java平台设计专家所使用的技术的全面描述,揭示了应该做什么,不应该做什么才能产生清晰.健壮和高效的代码.第2版反映了Java 5中最重要的变化,并删去了过时的内容. <Effective Java中文版(第2版)>中的每条规则都以简短.独立的小文章形式出现,并

简历浅析

精益技术简历之道——改善技术简历的47条原则 原文链接:http://lucida.me/blog/lean-technical-resume/ 关于 这篇文章围绕着技术简历这个话题,从版式.个人信息.技术能力.项目经历和教育背景等方面出发,给出了编写高质量技术简历所应遵循的47条原则.它们既有益于求职者编写高质量的简历,也有助于招聘者筛选合格的求职者. 为什么要编写这篇文章? 技术简历既是技术人员求职必不可少的一环,也是找工作的第一步,其重要性不言而喻.然而关于如何编写技术简历的靠谱教程却少之