Java产生随机数从广义来讲,大概有三种:

1、通过System.currentTimeMillis()来获取一个当前时间毫秒的long型数字

【Ps:这个方法返回一个从1970年1月1日0点0分0秒到当前的一个毫秒数,返回类型是long型,所以这个返回值是每时每刻都是在变化的,因为1970年的1月1日刚好是星期一,比较好算时间,一般可以用来程序运行的速度,如下:】

package javaDemo2;
/**
 * 
 * 产生随机数的小测试和总结
 * @author Monster丶ZF
 * @version1.8
 * @data 2019年4月4日
 * @remakeTODO
 */
public class RandomFunctionTest {
	public static void main(String[] args) {
		long startTime = System.currentTimeMillis();
      int num = 0;
      while(true){      //死循环,一般用break来解决,与if是好基友,一般同时用
     	 if(num++ == Integer.MAX_VALUE){    //整型里的最大值
     		 break;                      
     	 }
      }
      long endTime = System.currentTimeMillis();
      System.out.println("循环已结束" + num);
      System.out.println("循环用时:" + (endTime - startTime) + "毫秒");
      	}

}

因为是num++,所以会出现溢出现象变成负数的了

2、通过Math.random()返回一个0到1之间的double值。

【Ps:这个本身产生的随机数是[0.0-1.0)之间的double类型的小数,我们可以把他乘以一定的倍数来得到想要的效果,例子如下:】

package javaDemo2;
/**
 * 
 * 产生随机数的小测试和总结
 * @author Monster丶ZF
 * @version1.8
 * @data 2019年4月4日
 * @remakeTODO
 */
public class RandomFunctionTest {
	public static void main(String[] args) {
		//比如要产生一个[5-18]之间的一个随机数
		int a ;
		a =(int) Math.random();//首先写到这步会报错,因为Math.random()产生的是一个[0.0-1.0)之间
		                       //double类型数字,而a定义的时候是存放整型的,所以加个强制转换
		
		a = (int)(Math.random()*10000) ;//我们根据需要随便乘以一个较大的数字扩大一下上限和下限
		
		a =  (int)(Math.random()*10000) % 10;//%10相当于取个位数可以生成[0-9]之间的整型数字
		
		a = (int)(Math.random()*10000) % 10 + 5; //可以生成[5-14]之间的整型数字,但我们需要的是[5-18]
	   
		a =(int)(Math.random()*10000) % 14 + 5;
		//%14可以产生[0-13]的随机数在+5就可以产生[5-18]之间的随机整数
		System.out.println(a);
		
		//其实多试几个,我们就可以发现规律了
		//即要产生[a-b]之间的一个整型随机数,
		//则公式为:(int)(Math.random()*10000) % (b - a + 1) + a;
		//其中的10000可根据需求灵活选取
			}

}
    其实多试几个,我们就可以发现规律了
	即要产生[a-b]之间的一个整型随机数,
	则公式为:(int)(Math.random()*10000) % (b - a + 1) + a;
	其中的10000可根据需求灵活选取


3、通过Random类来产生一个随机数,这个是专业的Random工具类,功能强大。

【Ps:我们可以通过新建一个Random的对象来产生随机数,他可以产生随机整数、floatdouble、long型随机数,同时import java.util.Random类有两种构建方式:带种子不带种子。测试如下:】

package javaDemo2;

import java.util.Random;

/**
 * 
 * 产生随机数的小测试和总结
 * @author Monster丶ZF
 * @version1.8
 * @data 2019年4月4日
 * @remakeTODO
 */
public class RandomFunctionTest {
	public static void main(String[] args) {
		//不带种子,这种方式将会返回随机的数字,每次运行结果都不一样
		Random ran = new Random(); 
		for (int i = 0; i < 5; i++) {
			System.out.println(ran.nextDouble());
			
		}
			}

}

其中System.out.println(ran.nextDouble());也可以换成ran.nextInt();ran.nextfloat();之类的

还有一种情况是int nextInt(int n); 返回一个伪随机数,它是从此随机数生成器的序列中取出的,在包括0和指定值n(不包括)之间均匀分布的int值,如下:

package javaDemo2;

import java.util.Random;

/**
 * 
 * 产生随机数的小测试和总结
 * @author Monster丶ZF
 * @version1.8
 * @data 2019年4月4日
 * @remakeTODO
 */
public class RandomFunctionTest {
	public static void main(String[] args) {
		//不带种子,这种方式将会返回随机的数字,每次运行结果都不一样
		Random ran = new Random(); 
		for (int i = 0; i < 5; i++) {
			System.out.println(ran.nextInt(10));
			
		}
					}

}

运行结果:

带种子的:

public class RandomFunctionTest {
	public static void main(String[] args) {
		//带种子的,无论程序运行多少次,返回结果都是一样的
		Random ran  = new Random(10);//括号 里面的10即为种子
		Random ran2 = new Random(10);
		for (int i = 0; i < 5; i++) {
			System.out.println(ran.nextInt());
		}
		System.out.println("----------------------------------------");
		for (int i = 0; i < 5; i++) {
			System.out.println(ran2.nextInt());
		}
						}

}

可以发现输出的结果,两次结果均相同,重复运行也均是同样的结果

两种方式的差别:
Random()
创建一个新的随机数生成器。
Random(long seed)
使用单个 long 种子创建一个新随机数生成器: public Random(long seed) { setSeed(seed); } next 方法使用它来保存随机数生成器的状态。

通俗说,两者的区别是:

带种子的,每次运行生成的结果都是一样的。如果用相同的种子创建两个 Random 实例,则对每个实例进行相同的方法调用序列,它们将生成并返回相同的数字序列。

不带种子的,每次运行生成的都是随机的,没有规律可言。

更多推荐

教你如何产生随机数!!!