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);