210903-实战小技巧17:随机数生成怎么选

文章目录
  1. 1. Math.random
  2. 2. Random
  3. 3. Math.random 与 Random如何选
  • II. 其他
    1. 1. 一灰灰Blog: https://liuyueyi.github.io/hexblog
    2. 2. 声明
    3. 3. 扫描关注
  • 每天一个实战小技巧,随机数生成怎么选

    随机数生成,java中有一个专门的Random类来实现,除此之外,使用Math.random的也比较多,接下来我们简单学习下,随机数的使用姿势

    1. Math.random

    jdk提供的基础工具类Math中封装一些常用的基础方法,比如我们今天的主题,生成随机数,使用姿势如下

    1
    double val = Math.random();

    使用起来比较简单,生成的是[0,1)之间的浮点数,但是不要以为它就真的只能生成0-1之间的随机数,举例如下

    如果想利用它,生成一个 [120, 500] 这个区间的随机数,怎么整?

    1
    int ans = Double.valueOf(Math.ceil(Math.random() * 381 + 120)).intValue();

    为啥上面的可行?

    将上面的代码翻译一下,取值区间如

    Math.random() * 381 + 120 取值范围如下

    • [0, 1) * 381 + 120
    • [0, 381) + 120
    • [120, 501)

    借助Math.ceil只取浮点数中的整数部分,这样我们的取值范围就是 [120, 500]了,和我们的预期一致

    最后简单来看下,Math.random()是怎么实现随机数的

    1
    2
    3
    4
    5
    6
    7
    private static final class RandomNumberGeneratorHolder {
    static final Random randomNumberGenerator = new Random();
    }

    public static double random() {
    return RandomNumberGeneratorHolder.randomNumberGenerator.nextDouble();
    }

    请注意上面的实现,原来底层依然使用的是Random类来生成随机数,而且上面这种写法属于非常经典的单例模式写法(不同于我们常见的双重判定方式,这种属于内部类的玩法,后面再说为啥可以这么用)

    2. Random

    除了使用上面的Math.random来获取随机数之外,直接使用Random类也是很常见的case;接下来先简单看一下Random的使用姿势

    创建Random对象

    1
    2
    3
    4
    // 以当前时间戳作为随机种子
    Random random = new Random();
    // 以固定的数字作为随机种子,好处是每次执行时生成的随机数是一致的,便于场景复现
    Random random2 = new Random(10);

    生成随机数

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    // [0, max) 之间的随机整数
    random.nextInt(max);

    // 随机返回ture/false
    random.nextBoolean()

    // 随机长整数
    random.nextLong()

    // 随机浮点数
    random.nextFloat()
    random.nextDouble()

    伪随机高斯分布双精度数

    1
    random.nextGaussian()

    随机类的nextGaussian()方法返回下一个伪随机数,即与随机数生成器序列的平均值为0.0,标准差为1.0的高斯(正态)分布双精度值

    这种使用场景可能用在更专业的场景,至少我接触过的业务开发中,没有用过这个😂

    3. Math.random 与 Random如何选

    上面两个都可以用来生成随机数,那么在实际使用的时候,怎么选择呢?

    从前面的描述也可以知道,它们两没啥本质区别,底层都是用的Random类,在实际的运用过程中,如果我们希望可以场景复现,比如测试中奖概率的场景下,选择Random类,指定随机种子可能更友好;如果只是简单的随机数生成使用,那么选择Math.random即可,至少使用起来一行代码即可

    系列博文:

    II. 其他

    1. 一灰灰Bloghttps://liuyueyi.github.io/hexblog

    一灰灰的个人博客,记录所有学习和工作中的博文,欢迎大家前去逛逛

    2. 声明

    尽信书则不如,以上内容,纯属一家之言,因个人能力有限,难免有疏漏和错误之处,如发现bug或者有更好的建议,欢迎批评指正,不吝感激

    3. 扫描关注

    一灰灰blog

    QrCode

    评论

    Your browser is out-of-date!

    Update your browser to view this website correctly. Update my browser now

    ×