java中如何生成随机数

        在程序中,有时需要生成随机数,这是不可避免的,但在java中我们应该如何生成我们所需要的随机数呢?

       java为我们生成随机数提供了两种方式:一种是类Math,一种是类Random。

       接下来我们来了解一下这两个类是如何使用的:

  Math类:

            public static synchronized doublerandom()

            Added in API level 1

            Returns a pseudo-random double n, where n >= 0.0 && n < 1.0. This method reuses a single instance ofRandom. This method is thread-safe because access to theRandom is synchronized, but this harms scalability. Applications may find a performance benefit from allocating aRandom for each of their threads.

            以上是api中解释,random()方法是类Math的一个静态方法。Math.random()能够为我们生成一个double型的随机数,这个随机数的范围为大于等于0.0,少于1.0。

            由以上解释,生成0到1的随机数,有时不满足我们的需求。比如说我们要生成0到100的整数,如下:

                int random = (int)(Math.random()*100);//注意,这里不是(int)Math.random()*100,否则会生成的随机数一直为0,因为0到1之间的小数强制转换为整数不会进行四舍五入会直接取整。所以这里根据需求来生成我们需要的随机数。


        Random类:

            首先Random类从字面上理解为随机的意思,也就是能为我们生成我们需要的随机数。

            我们来看看是如何使用的:

     Random r = new Random();
               for(int i = 0; i < 10; i++){
                       System.out.print("bool:" + r.nextBoolean() + " ");
                       System.out.print("double:" + r.nextDouble() + " ");
                       System.out.print("float:" + r.nextFloat() + " ");
                       System.out.print("gaussian:" + r.nextGaussian() + " ");
                       System.out.print("int:" + r.nextInt() + " ");
                       System.out.print("long:" + r.nextLong() + " byte: ");

                       byte []b = new byte[10];
                       r.nextBytes(b);
                       for(int j = 0; j < 10; j++)
                               System.out.print((byte)b[j] + " ");
                               System.out.println();

                }

                 上述代码的测试结果如下:

 

                我们可以看出Random类在它的这几个方法中可以生成下负数。

                r.nextBoolean()生成bool型true或false。

                r.nextDouble()生成double型随机数,double的取值范围是[0, 1)。

                r.nextFloat()生成float型随机数,flaot的取值范围是[0,1)。

                r.nextGaussian()生成double型随机数, double的取值范围是gaussian类型的范围。

                r.nextInt()生成int型随机数, int的取值范围是正负数的int型的范围。

                r.nextLong()生成long型随机数,long的取值为long型数据。

                r.nextbyte(byte[])生成byte型随机数数组,其数组中为byte型大小的数,有正负数。


    Random类还有一个构造方法Random(int seed),seed为种子的意思。

    Random r1 = new Random(20);

              r1.nextInt(100); //可以生成[0,100)的随机整数,这个方法在上面没有说明,因为这里用到了seed,在这里new Random(20)中的20没起到直接作用,但并不是没起到作用。我们看看以下测试结果。

             Random r1 = new Random(20);
             Random r2 = new Random(20);
             for(int i = 0; i < 10; i++){
                     System.out.println("i1:" + r1.nextInt(100) + "  i2:"+ r2.nextInt(100) );
             }

             测试结果:

       

   我们发现这两个对象r1,r2生成的随机数是一样的。

   那我们再换种方式:

           Random r1 = new Random();
           Random r2 = new Random(20);
           for(int i = 0; i < 10; i++){
                   System.out.println("i1:" + r1.nextInt(100) + "  i2:"+ r2.nextInt(100) );
           }

            测试结果:

       

   我们发现生成的随机数就不一样了。

   所以不同的种子seed对生成的随机数也会产生影响。

   

   总结:以上我们会发现Random类使用起来比Math类要复杂点,但总体说我们可以根据具体需求选择那种方式。



                +_+ @ a little a day


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值