随机数Random

Math.random()产生[0.0,1.0)不包括1.0的double随机数。
下列代码产生[1,10)的随机数:1+Math.random()*10;
产生[m,n)的随机数代码:m+(n-m)*Math.random();
Java系统还提供了一个更强大的Random类,Math.random函数内部实现就是使用的Random类。Random类中实现的随机算法是伪随机,也就是有规则的随机。在进行随机时,随机算法的起源数字称为种子数(seed),在种子数的基础上进行一定的变换,从而产生需要的随机数字。
相同种子的Random对象,第一次生成的随机数字完全相同,第二次生成的随机数字也完全相同。
下面演示使用同样的seed运行两次产生同样的随机数序列。

import java.util.*;
public class Test{
    public static void main(String [] args){
        for(int i=0;i<2;i++){
            Random r=new Random(1);
            System.out.println(r.nextDouble());
            System.out.println(r.nextDouble());
        }
    }
}

两次的运行结果:
这里写图片描述
代码中使用种子数值为1,可以看到,在第一次循环产生的前两个随机数和第二次循环产生的前两个随机数是相同的。有时候这样的结果也是很有用的,例如,多次测试过程中,为保证每次测试的数据环境一致,每次测试产生的随机样本在随机的情况下还要求两次测试的随机数据相同。
Random提供了两种构造函数:
Random r = new Random();
Random r = new Random(10);
默认构造函数使用了系统时间作为seed,便于每次产生不同的随机数。为避免相同种子导致产生的随机数相同,尽量在整个系统中使用一个Random对象产生随机数。
Random中常用的普通方法:
(1)public synonronized void setSeed(long seed)
该方法是设定基值seed。
(2)public int nextInt()
该方法是产生一个整型随机数。
(3)public long nextLong()
该方法是产生一个long型随机数。
(4)public float nextFloat()
该方法是产生一个Float型随机数。
(5)public double nextDouble()
该方法是产生一个Double型随机数。
(6)public synchronized double nextGoussian()
该方法是产生一个double型的Goussian随机数。
获取指定范围的随机数
随机数控制在某个范围内,使用模数运算符%

 import java.util.*;
 public   class Test {
       public static void main(String[] args) {
          Random random = new Random();
             for(int i = 0; i < 10;i++) {  
             int i=  Math.abs(random.nextInt())%10;  
             System.out.println();                                       
              }
       }
}

获得的随机数有正有负的,用Math.abs使获取数据范围为非负数

获取指定范围内的不重复随机数

import java.util.*;
    class Test {
        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]);
            }
        }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值