Random学习笔记

总说Random可以随机产生数值,其实是“假”的

怎么个假法?

        for (int i = 0; i < 10; i++) {
            Random random = new Random(15);
            System.out.println(random.nextInt(100));
        }

运行出来都是41,为啥呢?

随机数其实是由Random里面seed种子决定的,然后通过一个算法计算出这个所谓的随机数,其实就不是上面随机数

那么随机数是怎么产生的呢?

/**
     * Creates a new random number generator. This constructor sets
     * the seed of the random number generator to a value very likely
     * to be distinct from any other invocation of this constructor.
     */
    public Random() {
        this(seedUniquifier() ^ System.nanoTime());
    }

在这里创建不同的种子,所以产生不同的数,给别人幻觉是随机的。

 

下一个新种子是通过CAS进行更新的,如果拿到的种子和oldseed一样的话,根据算法来更新成newseed。如果拿到的种子和旧种子不一致的时候,表示已经被更新了,会循环去获取。第二次获取的时候得到新的 种子和旧的种子一样,那么也根据算法去更新种子。

 

在多线程操作的时候,难免会出现多个线程去操作同一个种子,比如共享对象Random random = new Random(15);通过nextInt获取下一个种子。如果有多个线程并发修改种子,那么肯定会出现CAS锁自旋,导致cpu消耗很高。

 

可以使用ThreadLocalRandom

它的种子和线程挂钩,所以就不会出现nextseed永远是同一个,避免使用CAS来同步,以及种子的竞争

 

转载https://mp.weixin.qq.com/s/KQlI8wm2U-GPn60UhpDEcg

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值