Java生成随机数的方法
一.使用Math.random()方法
直接使用Math.random()这个静态的方法,random()方法返回一个[0,1)的随机数;
Math.random() 产生的随机数是0-1之间的一个double,我们可以把他乘以一定的数,比如说乘以100,他就是个100以内的随机
int ran = Math.random()*100
//1-10的随机数
int random=(int)(Math.random()*10+1);
//1-50的随机数
new Random().nextInt(50) + 1
使用
for (int i = 0; i < 10; i++)
{
System.out.println(Math.random());
}
结果
0.3598613895606426
0.2666778145365811
0.25090731064243355
0.011064998061666276
0.600686228175639
0.9084006027629496
0.12700524654847833
0.6084605849069343
0.7290804782514261
0.9923831908303121
当第一次调用 Math.random() 方法时,自动创建了一个伪随机数生成器,实际上用的是 new java.util.Random()。当接下来继续调用 Math.random() 方法时,就会使用这个新的伪随机数生成器。
源码如下
public static double random()
{
Random rnd = randomNumberGenerator;
if (rnd == null) rnd = initRNG(); // 第一次调用,创建一个伪随机数生成器
return rnd.nextDouble();
}
private static synchronized Random initRNG()
{
Random rnd = randomNumberGenerator;
return (rnd == null) ? (randomNumberGenerator = new Random()) : rnd; // 实际上用的是new java.util.Random()
}
initRNG() 方法是 synchronized 的,因此在多线程情况下,只有一个线程会负责创建伪随机数生成器(使用当前时间作为种子),其他线程则利用该伪随机数生成器产生随机数。Java生成随机数的几种高级用法,这篇推荐看一下。
因此 Math.random() 方法是线程安全的。
什么情况下随机数的生成线程不安全:
线程1在第一次调用 random() 时产生一个生成器 generator1,使用当前时间作为种子。
线程2在第一次调用 random() 时产生一个生成器 generator2,使用当前时间作为种子。
碰巧 generator1 和 generator2 使用相同的种子,导致 generator1以后产生的随机数每次都和 generator2 以后产生的随机数相同。
什么情况下随机数的生成线程安全: Math.random() 静态方法使用
线程1在第一次调用 random() 时产生一个生成器 generator1,使用当前时间作为种子。
线程2在第一次调用 random() 时发现已经有一个生成器generator1,则直接使用生成器 generator1
public class JavaRandom
{
public static void main(String args[]<