<%@ page contentType="text/html; charset=gb2312"%> 浅析Java中的随机数类
网站公告:   ◆北天JAVA技术网热情为java爱好者服务,本网内容包括JAVA(JSP、servlet、EJB、webservice、j2ee、javabean、应用服务器、JavaScript),数据库(MYSQL、SQL Server、Sybase、Oracle、DB2、数据库综合知识),设计研究(设计模式、Struts、Spring、Hibernate、设计框架、设计综合知识),WEB2.0新技术(主要介绍AJAX),以及各种技术的入门、实例、例子等等,欢迎各位多来坐坐!◆  诚邀各位JAVA爱好者加盟!◆  本网站内容丰富,更新快,保证每周20篇以上!  
加入收藏
设为首页
联系站长
承接项目
  相关资源:网站首页 | 免费培训学院 | 技术论坛 | JAVA聊天室 | 作家专栏 | 开发工具 | 认证考试 | 会员俱乐部
  JAVA技术初学者园地 | jsp与servlet | javascript | Java源代码 | EJB | web service | 应用服务器 | JAVA综合知识
  设计研究设计模式 | 设计框架 | Struts | Spring | Hibernate | 开源项目 | 面向对象设计 | 设计综合知识
  数 据 库MYSQL | SQL Server | Sybase | Oracle | DB2 | Informix | Access | 数据库综合知识
  其他资源:AJAX新技术 | 网站开发 | ERP软件 | OA办公软件 | 商业智能BI | 开发综合知识 | 承接项目 | 项目试用

 
 
浅析Java中的随机数类
     发布者: 发布时间:2006-10-20

     Java中的随机数是否可以重复?Java中产生的随机数能否可以用来产生数据库主键?带着这个问题,我们做了一系列测试。

1.测试一: 使用不带参数的Random()构造函数

 * @author Carl Wu

 */

public class RandomTest  {

 public static void main(String[] args) {

      java.util.Random r=new java.util.Random();

     for(int i=0;i<10;i++){

         System.out.println(r.nextInt());

     }

 }}

程序运行结果:
-1761145445

-1070533012

216216989

-910884656

-1408725314

-1091802870

1681403823

-1099867456

347034376

-1277853157


再次运行该程序:

-169416241

220377062

-1140589550

-1364404766

-1088116756

2134626361

-546049728

1132916742

-1522319721

1787867608

    从上面的测试我们可以看出,使用不带参数的Random()构造函数产生的随机数不会重复。那么,什么情况下Java会产生重复的随机数呢?且看下面的测试。


2. 测试二:为Random设置种子数

 * @author Carl Wu

 */

public class RandomTest_Repeat {

 

    /**

     * @param args

     */

    public static void main(String[] args) {

        java.util.Random r=new java.util.Random(10);

       for(int i=0;i<10;i++){

           System.out.println(r.nextInt());

       }

   }

 

}

 

无论程序运行多少次,其结果总是:
-1157793070

1913984760

1107254586

1773446580

254270492

-1408064384

1048475594

1581279777

-778209333

1532292428

 

甚至在不同的机器上测试,测试结果也不会改变!

 

3.原因分析:

 

(1) 首先请打开Java Doc,我们会看到Random类的说明:

 

此类的实例用于生成伪随机数流,此类使用 48 位的种子,该种子可以使用线性同余公式对其进行修改(请参阅 Donald Knuth 的《The Art of Computer Programming, Volume 2》,第 3.2.1 节)。

 

如果用相同的种子创建两个 Random 实例,则对每个实例进行相同的方法调用序列,它们将生成并返回相同的数字序列。为了保证实现这种特性,我们为类Random指定了特定的算法。为了 Java 代码的完全可移植性,Java 实现必须让类 Random 使用此处所示的所有算法。但是允许 Random 类的子类使用其他算法,只要其符合所有方法的常规协定即可。

 

Java Doc对Random类已经解释得非常明白,我们的测试也验证了这一点。

(2) 如果没有提供种子数,Random实例的种子数将是当前时间的毫秒数,可以通过System.currentTimeMillis()来获得当前时间的毫秒数。打开JDK的源代码,我们可以非常明确地看到这一点。

    /**
     * Creates a new
random number generator. Its seed is initialized to
     * a value based on the current time:
     * <blockquote><pre>
     * public Random
() { this(System.currentTimeMillis()); }</pre></blockquote>
     *
     * @see     java
.lang.System#currentTimeMillis()
     */
public Random
() { this(System.currentTimeMillis()); }
 

 

4. 结论:

 

通过上面的测试和分析,我们会对Random类有较为深刻的理解。同时,我觉得,通过阅读Java Doc的API文档,可以很好地提高我们的Java编程能力,做到“知其然”;一旦遇到费解的问题,不妨打开Java的源代码,这样我们就能做到“知其所以然”。

(转载文章请保留出处:北天JAVA技术网(www.java114.com))
 
更多精彩文章:
如何保护Java程序
Java的垃圾回收(Garbage Collection)机制
Java对象及其引用
单例模式陷阱
Dom4j学习笔记
三重DES加密程序
 
最近评论:
        
你曾悄悄的来过!
wow gold,wow gold,wow gold,ffxi gil max(4752)
        
冰封的往事!
wow power leveling,wow gold,wow power leveling,wow gold max(6798)
        
冰封的往事!
wow power leveling,wow gold,WoW Gold,wow gold max(7458)
        
飞舞的传奇!
传世私服,传世私服.传奇世界私服传奇世界私服,传世私服传世私服, 传奇世界私服传奇世界私服.传奇私服传奇私服. max(2588)
        
回复:浅析Java中的随机数类
写的不好
        
标 题:   
内 容:   
 
                                  
 
免责声明:该文章由网友发表,如果对您造成侵权,请联系站长

首页 - 承接项目 - 网站地图 - 联系我们 -
版权所有北天JAVA技术工作室 ICP证号:粤ICP备06079815号