java随机数探究nextInt的均匀取模随机
⼀java常见的获取随机数⽅式
都是通过计算获得的 这种随机序列可以根据传参推导出来 所以都是伪随机
java官⽅的 线性同余 还有混合同余 乘法同余
1 java.util.Random 最基础的⽅式
Random random = new Random(); //不传⼊种⼦则将时间作为参数参与随机计算
<*
2 Math.random
Math.random 返回[0,1)的随机数返回值不固定
3 对当前系统时间的秒数 进⾏hash 取模等操作获取随机值
Math.random》 java.util.Random 》 lcg算法
Random java基础随机类
1可以根据公式推导出来随机数 伪随机
2线程安全 ⾼并发使⽤ ThreadLocalRandom
3常⽤⽅法
next举例
public int nextInt(int bound) {
if (bound <= 0)
java生成随机数的方法throw new IllegalArgumentException(BadBound);
int r = next(31);
int m = bound - 1;
if ((bound & m) == 0)
r = (int)((bound * (long)r) >> 31); 与随机值做随机直接进⾏位运算获取区间值
else {
for (int u = r;
u - (r = u % bound) + m < 0; //此处在正常的数学计算是恒为整数在这⾥通过溢出⽅式踢出⽣成分布不均匀的随机参数 u = next(31))
;
}
return r;
}
protected int next(int bits) {
long oldseed, nextseed;
AtomicLong seed = this.seed;
do {
oldseed = ();
//核⼼线程安全对种⼦进⾏lcg计算返回返回指定位数
nextseed = (oldseed * multiplier + addend) & mask;
} while (!seedpareAndSet(oldseed, nextseed));
return (int)(nextseed >>> (48 - bits));
}
Math.random
1原理 调⽤Random类
public static double random() {
return Double();
}
静态内部holder类 保证单例 种⼦唯⼀
private static final class RandomNumberGeneratorHolder {
static final Random randomNumberGenerator = new Random();
}
2线程安全 ⾼并发不建议使⽤
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论