JAVA中生成随机数方法
(1)使用Math.random()。Math.random()随机地选取一个0~1之间的double类型小数,如果将其乘以一个数,比如100,就得到0~100之间的随机数值:
int randomNumber = (int) Math.round(Math.random()*(max-min)+min);
(2)利用System类的currentTimeMillis()方法,这个方法返回从1970年1月1号0点0分0秒到当前的一个long型的毫秒 数,可作为一个随机数,还可以将其对某些数取模,就能限制随机数的范围;此方式在循环中同时产生多个随机数时,会是相同的值,有一定的局限性!
long randomNum = System.currentTimeMillis();
int randomNumber = (int) randomNum%(max-min)+min;
(3)Random类
Random类中实现的随机算法时伪随机,也就是有规则的随机。在进行随机时,随机算法的起源数字称为种子数(seed),在种子数的基础上进行一定的变换,从而产生需要的随机数字。(种子数只是随机算法的起源数字,和生成的随机数字的区间无关)。
Random类包含两个构造方法:
1) public Random()
该构造方法使用和当前系统时间有关的数字作为种子数,然后使用这个种子数构造Random对象。实际上Math.Random()内部也是利用这个构造方法来创建随机数(细节可查看源码)。
Random r=new Random()
2)public Random(long seed)
使用指定的种子数seed创建Random对象,如果种子数相同,生成的随机数也会相同。
Random r=new Random(1000)
主要方法:
public boolean nextBoolean()
生成一个随机的boolean值,生成true和false的几率相等。
public double nextDouble()
生成一个随机的double值,数值介于[0,1]之间。
public int nextInt()
生成一个随机的int值,该值介于int类型整数范围之内。
public int nextInt(int n)
生成一个随机的int值,该值介于[0,n)之间。
public void setSeed(long seed)
重新设置Random对象中的种子数。设置完种子数以后的random对象和相同种子数的使用new关键字创建出的Random对象相同。
生成指定范围内的随机数方法:
//1.直接两重循环去重
public static int [] randomCommon(int min,int max,int n){
if(n>(max-min+1)||max<min){
return null;
}
int [] result=new int[n];
int count=0;
while(count<n){
int num= (int) (Math.random()*(max-min) +min);
boolean flag=true;
for(int j=0;j<n;j++){
if(num==result[j]){
flag=false;
break;
}
}
if(flag){
result[count]=num;
count++;
}
}
return result;
}
//2.排除已经随机的数
public static int [] randomArray(int min,int max,int n){
int len=max-min+1;
if(max<min || n>len){
return null;
}
//初始化给定范围的待选数组
int [] seq=new int[len];
for(int i=min;i<min+len;i++){//初始时seq数组存储 min~max的所有数
seq[i-min]=i; //i: len-1
}
int [] result=new int[n];
Random rand=new Random();
for(int i=0;i<result.length;i++){
int index=rand.nextInt(len); //生成随机下标,范围是0~len
result[i]=seq[index];
seq[index]=seq[len-1];
len--;
}
return result;
}