xxxatt的专栏

要活的好像明天就要死去一样!

java随机数

在Java 中我们可以使用java.util.Random类来产生一个随机数发生器。它有两种形式的构造函数,分别是Random()和Random(long seed)。Random()使用当前时间即System.currentTimeMillis()作为发生器的种子,Random(long seed)使用指定的seed作为发生器的种子。

        随机数发生器(Random)对象产生以后,通过调用不同的method:nextInt()、nextLong()、nextFloat()、nextDouble()等获得不同类型随机数。

       1>生成随机数
           Random random = new Random();
           Random random = new Random(100);//指定种子数100
           random调用不同的方法,获得随机数。
           如果2个Random对象使用相同的种子(比如都是100),并且以相同的顺序调用相同的函数,那它们返回值完全相同。如下面代码中两个Random对象的输出完全相同
          import java.util.*;
          class TestRandom {
                public static void main(String[] args) {
                     Random random1 = new Random(100);
                     System.out.println(random1.nextInt());
                     System.out.println(random1.nextFloat());
                     System.out.println(random1.nextBoolean());
                     Random random2 = new Random(100);
                     System.out.println(random2.nextInt());
                     System.out.println(random2.nextFloat());
                     System.out.println(random2.nextBoolean());
                }
            }

        2>指定范围内的随机数
             随机数控制在某个范围内,使用模数运算符%
            import java.util.*;
                 class TestRandom {
                      public static void main(String[] args) {
                           Random random = new Random();
                           for(int i = 0; i < 10;i++) {
                               System.out.println(Math.abs(random.nextInt())%10);
                           }
                      }
                 }
             获得的随机数有正有负的,用Math.abs使获取数据范围为非负数

       3>获取指定范围内的不重复随机数
            import java.util.*;
            class TestRandom {
                  public static void main(String[] args) {
                       int[] intRet = new int[6];
                       int intRd = 0; //存放随机数
                       int count = 0; //记录生成的随机数个数
                       int flag = 0; //是否已经生成过标志
                       while(count<6){
                            Random rdm = new Random(System.currentTimeMillis());
                            intRd = Math.abs(rdm.nextInt())%32+1;
                            for(int i=0;i<count;i++){
                                if(intRet[i]==intRd){
                                    flag = 1;
                                    break;
                                }else{
                                    flag = 0;
                                }
                            }
                            if(flag==0){
                                intRet[count] = intRd;
                                count++;
                            }
                   }
                  for(int t=0;t<6;t++){
                      System.out.println(t+"->"+intRet[t]);
                  }
               }
            }
Java中的随机数是否可以重复?Java中产生的随机数能否可以用来产生数据库主键?带着这个问题,我们做了一系列测试。
1.测试一: 使用不带参数的Random()构造函数

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设置种子数

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的源代码,这样我们就能做到“知其所以然”。
阅读更多
上一篇使用hashtable对字符串操作
下一篇JSP中Session用法及其属性介绍
想对作者说点什么? 我来说一句

java 随机数的资源

2010年06月21日 59KB 下载

介绍java 产生随机数

2008年11月29日 3KB 下载

java产生随机数的几种方式

2011年05月17日 5KB 下载

java 随机数

2012年12月21日 53KB 下载

Java随机数的编程

2010年06月08日 121KB 下载

java 求最大的随机数

2010年06月18日 59KB 下载

Java产生随机数代码 各种方法

2009年05月27日 26KB 下载

没有更多推荐了,返回首页

关闭
关闭