Java里的随机数都怎么生成的?
Java 随机数生成的两种方式
在开发过程中可能会用到随机数的生成,一般我们通过在网上进行简单搜索都可以找到答案,但是有时候用到Math
类提供的方法,有时候又是用到Random
类提供的方法,那在Java中到底有几种生成随机数的方式?
Java 里用于生成随机数的方式有两种,通过 java.lang.Math
或 java.util.Random
两个类可以生成随机数。
这里做一下笔记:
java.lang.Math
-
Math.random()
Math.random() 返回 [0.0 , 1.0) 的double值 -
如果想指定范围怎么办?
(Math.random() * ((max - min) + 1)) + min可以一步一步的拆解下这个表达式:
Math.random() * ( max - min ) 返回的数值范围应该是 [ 0, (max-min) ),比如要获取 [5,10] 之间的随机数,放在这个表达式里,应该是 Math.random() * 5 = [ 0, 5 ) , 为了达到 [ 5, 10 ] 的范围,这里需要加上 min 的值, 即 Math.random() * (max - min) + min, 但是这个表达仍然不能达到 10 这个范围,所以要再 加1,最后的结果就是 (Math.random() * ((max - min)+1) + min
java.util.Random
Random 类可以用于获取多种类型的随机数,int, float, double, long, boolean.
拿 int 来说,我们可以通过调用 nextInt() 来获得随机数
- nextInt() 返回的是[-2^32 , 2^32]
public int nextInt() {
return next(32);
}
protected int next(int bits) {
long oldseed, nextseed;
AtomicLong seed = this.seed;
do {
oldseed = seed.get();
nextseed = (oldseed * multiplier + addend) & mask;
} while (!seed.compareAndSet(oldseed, nextseed));
return (int)(nextseed >>> (48 - bits));
}
- nextInt(int bound) 返回的是 [0. bound )
public int nextInt(int bound) {
if (bound <= 0)
throw new IllegalArgumentException(BadBound);
int r = next(31);
int m = bound - 1;
if ((bound & m) == 0) // i.e., bound is a power of 2
r = (int)((bound * (long)r) >> 31);
else {
for (int u = r;
u - (r = u % bound) + m < 0;
u = next(31))
;
}
return r;
}
总结: 对于简单的生成随机数来说,直接使用现成的方法就可以,如果希望获取某一范围内的随机数的话可以通过这两种方式:
- Math.random() * ((max - min)+1) + min
- random.nextInt(max - min) + min