天天看点

JAVA - 生成随机数

Java随机数产生原理

JAVA中的随机数都是伪随机数。伪随机数是看似随机实质是固定的周期性序列,也就是有规则的随机。Java的随机数产生是通过线性同余公式产生的,也就是说通过一个复杂的算法生成的。只要这个随机数是由确定算法生成的,那就是伪随机,只能通过不断算法优化,使你的随机数更接近随机

JAVA产生随机数的方法

java.lang.Math类的Random()方法

* Math.Random()函数能够返回带正号的double值,取值范围是[0.0,1.0),在该范围内(近似)均匀分布。因为返回值是double类型的,小数点后面可以保留15位小数,所以产生相同的可能性非常小,在这一定程度上是随机数

* Math.Random()方法经过处理可获得多种类型或任意范围的随机数

//返回大于等于0,小于n之间的随机整数
int num1 = (int)(Math.random()*n);
//返回大于等于m,小于m+n之间的随机整数
int num2 = m + (int)(Math.random()*n);   
//随机生成a~z之间的字符
char ch1 = (char)('a' + (int)(Math.random()*('z'-'a'+1)));
//随机生成char1~char2的字符
char ch2 = (char)(char1 + (int)(Math.random()*(char2-char1+1)));
           

java.util.Random类

通过实例化一个Random对象创建一个随机数生成器来生成随机数

* 类加载

import java.util.Random;
           

* Random类的构造方法:创建随机数生成器

Random():编译器以系统当前时间作为随机数生成器的种子

Random(long seed):自定义随机数生成器的种子

注:种子数和生成的随机数字的区间没有任何关系。种子数是产生随机算法的起源数字,通过一个函数将种子的值转化为随机数空间中的某一个点,并且产生的随机数均匀的散布在空间中,以后产生的随机数都与前一个随机数有关

Random r1 = new Random();

Random r2 = new Random(10);

* 生成随机数的方法

nextInt():返回一个随机整数

nextInt(int n):返回大于等于0,小于n的随机整数 

nextLong():返回一个随机长整型值 

nextBoolean():返回一个随机布尔型值

nextFloat():返回一个随机浮点型值  

nextDouble():返回一个随机双精度型值  

nextGaussian():概率密度为高斯分布的双精度值  

Random r1 = new Random(20);
System.out.println(r1.nextInt(10));
           

注:如果用相同的种子创建两个Random实例,则对每个实例进行相同次数的方法调用,它们将生成并返回相同的数字

Random r1 = new Random(20);
Random r2 = new Random(20);
System.out.println(r1.nextInt(10));
System.out.println(r1.nextInt(10));
System.out.println(r2.nextInt(10));
System.out.println(r2.nextInt(10));
           

运行结果:

3
6
3
6
           

* 生成MIN到MAX范围内的随机数

Random rand = new Random();
//随机产生为一个MIN到MAX范围内的随机数
System.out.println(rand.nextInt(MAX - MIN + 1) + MIN);