当前位置: 首页 > news >正文

关于 Math.random()生成指定范围内的随机数的公式推导

🚀 优质资源分享 🚀

学习路线指引(点击解锁)知识定位人群定位
🧡 Python实战微信订餐小程序 🧡进阶级本课程是python flask+微信小程序的完美结合,从项目搭建到腾讯云部署上线,打造一个全栈订餐系统。
💛Python量化交易实战💛入门级手把手带你打造一个易扩展、更安全、效率更高的量化交易系统

关于 Math.random()生成指定范围内的随机数的公式推导

在 java 中,用于生成随机数的 Math 方法 random()只能生成 0-1 之间的随机数,而对于生成指定区间,例如 a-b 之间的随机数,却只能用相关计算公式。
这个计算公式大家所熟知:

int num = (int) (a + Math.ransom() *(b-a+1));

对于这个公式,想必使用过的一定不会陌生,但是,时至今日,相信还有许多小伙伴对这个公式处于只会用,而不知其从何而来的境界。
这个公式设计的数学知识甚少,只是里面绕了一个弯,便把大部分人给绕晕了,希望这篇短小而又精悍的文章能够给大家带来些许帮助。

言归正传,首先,我们例如要求[a,b]之间的随机整数。
而 Math 的 random 方法只能生成(0,1)之间的随机数,这时,我们给 Math.random()生成的随机数乘上一个 b,也就是变成了公式

Math.random()*b

也就是(0,1)b,这时,能生成的随机数范围变成了(0,b)(tips:因为 0b=0,1*b=b),这时,我们要求的范围已经求出了他的最大范围值,但是,最先范围由于乘法还是零,所以,我们在再给(0,b)的取值再加 a

a+Math.random()*b;

这个公式最后给出的结果范围是(a,b+a);
这个结果与我们的期望值相差甚远,但是,如果我们在第一步

Math.random()*b

时,将b改为(b-a),即

Math.random()*(b-a);

这时,范围为(0,b-a),再进行第二步

a+Math.random()*(b-a);

这时,完成后的取值范围就是(a,b)。
但是,最后需要注意的是,我们通过random所求的公式,是一个(a,b)的浮点数,当我们转为int类型后,其取值范围是[a,b-1]。(例如(2,7)的取值范围,转为整数只能取2,3,4,5,6)
这时,我们需要最大取值范围再加1,于是,我们在第一步骤时就要完成

Math.random()*(b-a+1);

所以,最终,我们会得到公式:

a+Math.random()*(b-a+1);

相关文章:

  • 抛砖系列之git仓库拆分工具git-filter-repo
  • 基于51单片机温度监控Proteus仿真设计_报警值可调
  • 海关 瑞数5.5 找后缀加密入口解析
  • Cadence OrCAD Capture 绘制总线的方法
  • 高薪程序员面试题精讲系列145之前后端如何交互?Swagger你用过吗?
  • MySQL高级十:索引
  • 8月更新| Java on Visual Studio Code
  • 【牛客刷题】每日一练——Java语法的强化
  • 【Java】基础语法 | OOP用法 | 集合框架
  • 架构分析:「转转云平台」的 Kubernetes 实践
  • RHCE之搭建DNS服务器
  • 【进程 进程表】页表通常存在PCB中
  • 关于AbstractQueuedSynchronizer(JDK1.8)的一点理解.
  • 猿创征文 |【算法入门必刷】数据结构-栈(三)
  • 学习编程的第二十五天
  • 9月CHINA-PUB-OPENDAY技术沙龙——IPHONE
  • [ 一起学React系列 -- 8 ] React中的文件上传
  • 【Redis学习笔记】2018-06-28 redis命令源码学习1
  • 【跃迁之路】【669天】程序员高效学习方法论探索系列(实验阶段426-2018.12.13)...
  • Apache Spark Streaming 使用实例
  • CentOS6 编译安装 redis-3.2.3
  • centos安装java运行环境jdk+tomcat
  • Docker 1.12实践:Docker Service、Stack与分布式应用捆绑包
  • exif信息对照
  • Making An Indicator With Pure CSS
  • MaxCompute访问TableStore(OTS) 数据
  • miniui datagrid 的客户端分页解决方案 - CS结合
  • swift基础之_对象 实例方法 对象方法。
  • Wamp集成环境 添加PHP的新版本
  • webpack入门学习手记(二)
  • 爱情 北京女病人
  • -- 查询加强-- 使用如何where子句进行筛选,% _ like的使用
  • 基于Mobx的多页面小程序的全局共享状态管理实践
  • 跨域
  • 面试总结JavaScript篇
  • 前端代码风格自动化系列(二)之Commitlint
  • 入职第二天:使用koa搭建node server是种怎样的体验
  • 少走弯路,给Java 1~5 年程序员的建议
  • 一个JAVA程序员成长之路分享
  • 云栖大讲堂Java基础入门(三)- 阿里巴巴Java开发手册介绍
  • 最近的计划
  • MiKTeX could not find the script engine ‘perl.exe‘ which is required to execute ‘latexmk‘.
  • 你对linux中grep命令知道多少?
  • Java性能优化之JVM GC(垃圾回收机制)
  • ​如何防止网络攻击?
  • #Linux(权限管理)
  • #中国IT界的第一本漂流日记 传递IT正能量# 【分享得“IT漂友”勋章】
  • (2020)Java后端开发----(面试题和笔试题)
  • (SpringBoot)第七章:SpringBoot日志文件
  • (二)fiber的基本认识
  • (附源码)ssm高校志愿者服务系统 毕业设计 011648
  • (附源码)ssm基于jsp高校选课系统 毕业设计 291627
  • (论文阅读40-45)图像描述1
  • (十二)python网络爬虫(理论+实战)——实战:使用BeautfulSoup解析baidu热搜新闻数据
  • (算法)Game