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

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

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


1. Math.random



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


double val = Math.random();
复制代码


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


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

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()是怎么实现随机数的


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对象


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


生成随机数

// [0, max) 之间的随机整数
random.nextInt(max);
// 随机返回ture/false
random.nextBoolean()
// 随机长整数
random.nextLong()
// 随机浮点数
random.nextFloat()
random.nextDouble()
复制代码


伪随机高斯分布双精度数

random.nextGaussian()
复制代码


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


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


3. Math.random 与 Random如何选



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


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



相关文章
|
算法 安全 量子技术
【Python】蒙特卡洛模拟 | PRNG 伪随机数发生器 | 马特赛特旋转算法 | LCG 线性同余算法 | Python Random 模块
【Python】蒙特卡洛模拟 | PRNG 伪随机数发生器 | 马特赛特旋转算法 | LCG 线性同余算法 | Python Random 模块
342 0
|
6月前
|
算法 数据处理 数据安全/隐私保护
深入NumPy的随机数生成机制
【4月更文挑战第17天】本文探讨了NumPy的随机数生成机制,强调了伪随机数在科学计算中的重要性。NumPy提供了多种生成器,如`RandomState`(基于Mersenne Twister)、`Generator`(灵活且强大)和`default_rng`(推荐,基于PCG64)。生成随机数涉及初始化生成器、设置种子和调用相关方法。关注生成器的质量和性能,遵循最佳实践,如避免硬编码种子、使用最新NumPy版本以及选择合适的生成器和分布,能有效提升数据处理效率和准确性。
|
6月前
|
机器学习/深度学习 Python
NumPy 中级教程——随机数生成
NumPy 中级教程——随机数生成
106 1
|
算法 安全 数据安全/隐私保护
高效的随机数生成算法
在计算机科学和统计学中,随机数生成是一个重要的问题。随机数在许多领域广泛应用,包括密码学、模拟、游戏开发等。然而,生成高质量的随机数并不是一件容易的事情。本文将介绍一种高效的随机数生成算法——**梅森旋转算法(Mersenne Twister)**。
282 1
|
Java
如何使用Java实现随机数生成器
在Java编程中,需要生成随机数的情况非常常见。本文将介绍如何使用Java中提供的相关类和方法来实现随机数生成器。
103 1
|
编解码 安全 算法
随机数探秘|如果python不用random怎样生成随机数?
随机数探秘|如果python不用random怎样生成随机数?
526 0
|
PyTorch 算法框架/工具
Pytorch中设计随机数种子的必要性
Pytorch中设计随机数种子的必要性
265 0
Pytorch中设计随机数种子的必要性
|
算法 安全 PHP
【高级软件实习】蒙特卡洛模拟 | PRNG 伪随机数发生器 | LCG 线性同余算法 | 马特赛特旋转算法 | Python Random 模块
本篇博客将介绍经典的伪随机数生成算法,我们将 重点讲解 LCG(线性同余发生器) 算法与马特赛特旋转算法,在此基础上顺带介绍 Python 的 random 模块。 本篇博客还带有练习,无聊到喷水的练习,咳咳…… 学完前面的内容你就会了解到 Python 的 Random 模块的随机数生成的实现,是基于马特赛特旋转算法的,比如 random_uniform 函数。而本篇博客提供的练习会让你实现一个基于 LCG 算法的random_uniform,个人认为还是比较有意思的
562 0
【高级软件实习】蒙特卡洛模拟 | PRNG 伪随机数发生器 | LCG 线性同余算法 | 马特赛特旋转算法 | Python Random 模块
|
Python
Python经典编程习题100例:第50例:产生随机数
Python经典编程习题100例:第50例:产生随机数
146 0
|
算法 小程序
【密码学】一文读懂基于离散对数的随机数生成器
是的,我又来水文章了,本文带着大家来了解一个新的随机数生成器,基于离散对数的随机数生成器,之前已经带着大家了解过了两个类似的随机数生成器了,其中一个是BBS随机数生成器,另一个是基于RSA的随机数生成器,有兴趣的读者可以自行回顾一下之前的文章哈。
【密码学】一文读懂基于离散对数的随机数生成器