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



相关文章
|
缓存
【SVN异常】svn更新时,出现不知道这样的主机的解决方案
svn更新时,出现不知道这样的主机的解决方案
2117 0
【SVN异常】svn更新时,出现不知道这样的主机的解决方案
|
JSON 算法 API
1688拍立淘图片搜索接口全攻略
1688拍立淘图片搜索接口由阿里巴巴提供,支持通过上传图片在1688平台搜索相似商品。该接口基于图像识别技术,具备高精度匹配、丰富商品信息返回、支持多图片格式及可定制化搜索等特点,适用于电商选品、商品溯源和智能购物等场景。开发者需注册获取app_key与app_secret,并通过Python示例代码调用接口,实现图片搜索功能。
742 23
|
6月前
|
人工智能 自然语言处理 算法
2025年 GEO行业年度鸟瞰全景报告:商业化深耕期的全球竞合与企业适配指南
2025年,中国生成式AI搜索(GEO)市场规模突破480亿元,年增68%。技术成熟与企业需求推动商业化爆发,多模态检索、垂直领域适配成主流。头部效应显著,国内外巨头竞逐本土化与全球化赛道,中小企业迎来轻量化机遇。
|
9月前
|
存储 算法 API
唯品会智能分仓API技术解析:基于收货地址自动匹配最近仓库
唯品会智能分仓API通过地理编码与Haversine距离算法,自动将订单匹配至最近仓库,提升配送效率、降低成本。本文详解其技术原理、实现步骤与应用优势,助力开发者构建高效物流系统。(239字)
|
数据可视化 数据挖掘 数据处理
B 端试用期考核指标
B端产品经理试用期考核指标涵盖了项目策划、用户需求理解、团队协作、技术能力、创新思维、项目管理、产品投放时间、产品质量、产品利润及基础服务接入等方面。这些指标通过自我评估和上级评估相结合的方式进行,分为优秀(5分)到不合格(1分)五个等级。具体内容包括制定合理项目计划、准确把握用户需求、有效沟通协调团队、掌握技术细节、提出创新方案等。实际案例展示了如何通过成功项目实施、解决业务痛点、优化产品功能等方式,全面评估产品经理的综合能力,确保其胜任后续工作任务。
689 0
|
传感器 算法 物联网
CCF推荐C类会议和期刊总结:(计算机网络领域)
该文档总结了中国计算机学会(CCF)推荐的计算机网络领域C类会议和期刊,详细列出了各类会议和期刊的全称、出版社、dblp文献网址及研究领域,为研究者提供了广泛的学术交流资源和平台。
CCF推荐C类会议和期刊总结:(计算机网络领域)
|
安全 网络协议 Shell
文件上传漏洞(七)XISE寄生虫Weevely学习
文件上传漏洞(七)XISE寄生虫Weevely学习
|
存储 关系型数据库 MySQL
Mysql大数据批量插入方法
Mysql大数据批量插入方法
996 0
|
传感器 前端开发 JavaScript
前端开发者必备的VS Code插件推荐
前端开发者必备的VS Code插件推荐
|
存储 缓存 算法
OS—设备独立性软件
OS—设备独立性软件