实战小技巧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即可,至少使用起来一行代码即可



相关文章
|
8月前
|
算法
LabVIEW伪随机数生成器
LabVIEW伪随机数生成器
75 0
|
8月前
|
算法 数据处理 数据安全/隐私保护
深入NumPy的随机数生成机制
【4月更文挑战第17天】本文探讨了NumPy的随机数生成机制,强调了伪随机数在科学计算中的重要性。NumPy提供了多种生成器,如`RandomState`(基于Mersenne Twister)、`Generator`(灵活且强大)和`default_rng`(推荐,基于PCG64)。生成随机数涉及初始化生成器、设置种子和调用相关方法。关注生成器的质量和性能,遵循最佳实践,如避免硬编码种子、使用最新NumPy版本以及选择合适的生成器和分布,能有效提升数据处理效率和准确性。
|
算法 安全 数据安全/隐私保护
高效的随机数生成算法
在计算机科学和统计学中,随机数生成是一个重要的问题。随机数在许多领域广泛应用,包括密码学、模拟、游戏开发等。然而,生成高质量的随机数并不是一件容易的事情。本文将介绍一种高效的随机数生成算法——**梅森旋转算法(Mersenne Twister)**。
462 1
|
Java
如何使用Java实现随机数生成器
在Java编程中,需要生成随机数的情况非常常见。本文将介绍如何使用Java中提供的相关类和方法来实现随机数生成器。
117 1
|
算法 API Python
random — 伪随机数生成器(史上总结最全)
random — 伪随机数生成器(史上总结最全)
|
算法 安全 PHP
【高级软件实习】蒙特卡洛模拟 | PRNG 伪随机数发生器 | LCG 线性同余算法 | 马特赛特旋转算法 | Python Random 模块
本篇博客将介绍经典的伪随机数生成算法,我们将 重点讲解 LCG(线性同余发生器) 算法与马特赛特旋转算法,在此基础上顺带介绍 Python 的 random 模块。 本篇博客还带有练习,无聊到喷水的练习,咳咳…… 学完前面的内容你就会了解到 Python 的 Random 模块的随机数生成的实现,是基于马特赛特旋转算法的,比如 random_uniform 函数。而本篇博客提供的练习会让你实现一个基于 LCG 算法的random_uniform,个人认为还是比较有意思的
606 0
【高级软件实习】蒙特卡洛模拟 | PRNG 伪随机数发生器 | LCG 线性同余算法 | 马特赛特旋转算法 | Python Random 模块
|
算法 编译器 vr&ar
8位伪随机数生成算法c语言
8位伪随机数生成算法c语言
265 0
|
算法 小程序
【密码学】一文读懂基于离散对数的随机数生成器
是的,我又来水文章了,本文带着大家来了解一个新的随机数生成器,基于离散对数的随机数生成器,之前已经带着大家了解过了两个类似的随机数生成器了,其中一个是BBS随机数生成器,另一个是基于RSA的随机数生成器,有兴趣的读者可以自行回顾一下之前的文章哈。
【密码学】一文读懂基于离散对数的随机数生成器
|
Rust 算法 安全
【密码学】一文读懂随机数
本文简单的介绍了一下随机数的概念,然后给出了一个非密码学安全的随机数生成器--线性同余法,一定注意,这个方法不要用在密码学相关用途蛤。
【密码学】一文读懂随机数
|
算法 Serverless 数据安全/隐私保护
【密码学】一文读懂基于散列函数的伪随机数生成器
上回说到,小明制作了一个特殊的日记本,在每次输入正确的密码之后,都会随机的生成下一个密码,但是呢,由于小明设计随机数算法选的不太好,这让小红给钻了空子,这时候小明心里别提多伤感了,这。。。这我的日记不就相当于直接公开了吗,这是要社死的节奏啊,不行不行,我要换一个新的方法,这时候,小明刚好学完了密码学当中的散列函数,心想,这我要是直接用散列函数的输出作为随机密码的生成,这不就成了,哈哈,这时候小明心里别提有多美了,于是乎,小明设计出了如下的随机数生成算法。
【密码学】一文读懂基于散列函数的伪随机数生成器