Math.floor(Math.random() * (Max - Min + 1) + Min) 在 JavaScript 中如何工作? (理论)

2024-02-18

我正在学习 JavaScriptfreecodecamp.org https://www.freecodecamp.org, 基本 JavaScript。在舞台上103/110有一个任务是创建一个带有 2 个参数(最小值和最大值)的函数,并且该函数应该返回它们之间的随机数。给出了公式,我做了任务并完成了它,但我不太明白为什么这个公式有效。

function randomRange(myMin, myMax) {
  return Math.floor(Math.random() * (myMax - myMin + 1) + myMin);
}
console.log(randomRange(10, 20))

这是代码。

这就是公式Math.floor(Math.random()*(max - min + 1) + min。 您能解释一下这个公式以及为什么它有效吗?


我来解释一下这个公式:

Math.floor(Math.random() * (myMax - myMin + 1) + myMin);

假设我们想要一个 5-15 之间的随机数(包括 5 和 15 作为可能的结果)。好吧,我们将不得不使用 Math.random(),它只产生从 0 到大约 0.999999999999999 的值,所以我们需要做两个技巧才能处理这个问题。

第一个技巧认识到 Math.random() 的最低可能返回值是 0,并且 0 乘以任何值都是 0,因此我们需要从 0 开始我们的范围,并在最后进行调整以解决这一问题。我们不是从头开始计算 5-15,而是认识到 5-15 中有 11 个值(5、6、7、8、9、10、11、12、13、14 和 15),并计算出这么多值。从 0 (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10) 到使用 0-10 作为我们的范围。这就是myMax - myMin公式的一部分是这样的。它将我们的新最大值定义为 10。然后,在计算结束时,我们只需将 5 添加回我们得到的结果,以使可能的结果范围从 0-10 更改为 5-15。这就是+ myMin公式的一部分是这样的。

第二招认识到将 Math.random() 乘以新的最大范围 10 只能得到高达 9.999999999999 左右的结果,因为 Math.random() 只能高达 0.99999999999 左右(实际上从来不是 1)。当我们稍后使用 Math.floor() 使其成为整数时,它会将结果降低到 9,因此我们需要在那里加 1 以使最大可能值变为 10 而不是 9。这就是+ 1公式的一部分是这样的。


让我们通过一个示例来结束这一点。

Math.random() can be 0最低且大约0.99999999999999最高(绝不是 1)。让我们看看这两种情况会发生什么,看看这个范围是如何计算的。

如果我们运行我们调用过的案例randomRange(5, 15) and Math.random()给我们 0,这就是我们最终得到的结果:

Math.floor(Math.random() * (myMax - myMin + 1) + myMin);

=

Math.floor(0 * (15 - 5 + 1) + 5);

=

Math.floor(0 * 11 + 5);

=

Math.floor(0 + 5);

=

Math.floor(5);

=

5

所以可能的最小值是 5。如果我们运行我们调用过的情况randomRange(5, 15) and Math.random()给我们0.99999999999999,这就是我们最终得到的结果:

Math.floor(Math.random() * (myMax - myMin + 1) + myMin);

=

Math.floor(0.99999999999999 * (15 - 5 + 1) + 5);

=

Math.floor(0.99999999999999 * 11 + 5);

=

Math.floor(10.9999999999999 + 5);

=

Math.floor(15.9999999999999);

=

15

所以可能的最大值是 15。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Math.floor(Math.random() * (Max - Min + 1) + Min) 在 JavaScript 中如何工作? (理论) 的相关文章

  • 获取单词中重复次数最多的字母的数量

    我正在尝试计算单词中重复次数最多的字母的数量 function GreatestCount str var count for var i 0 i
  • 为具有可变内容的内联块元素提供相同的高度?

    我有 4 个宽度固定但内容可变的内联块元素 并且我希望所有这些元素具有相同的高度 最大元素的高度 请参见这个jsfiddle http jsfiddle net kKZXj 我应该如何实现这个目标 如果仅使用 css 无法做到这一点 那么使
  • C# 中四舍五入到偶数

    我没有看到 Math Round 的预期结果 return Math Round 99 96535789 2 MidpointRounding ToEven returning 99 97 据我了解 MidpointRounding ToE
  • 矩阵向量变换

    我正在编写一个代码来制作软件蒙皮器 骨骼 皮肤动画 并且我正处于 优化 阶段 蒙皮器工作得很好 并且在 Core 上 1 09 毫秒内对 4900 个三角形网格与 22 个骨骼进行蒙皮Duo 2 Ghz 笔记本 我需要知道的是 1 有人可以
  • Angular 2 最终版本路由器单元测试

    如何使用 karma 和 jasmine 对 Angular 2 0 0 版中的路由器进行单元测试 这是我的旧单元测试在版本 2 0 0 beta 14 中的样子 import it inject injectAsync beforeEac
  • 如何获取调用函数的“this”值?

    如果我有一个这样的函数 function foo this console log this function bar bar prototype func function foo this var test new bar test f
  • Node.js 和 Express:异步操作后如何返回响应

    我是 Node js 新手 所以我仍然对异步函数和回调很感兴趣 我现在的难题是如何在异步操作中从文件读取数据后返回响应 我的理解是发送回复的工作方式如下 这对我有用 app get search function req res res s
  • Typeahead.js 干扰 Bootstrap 输入组

    如何防止 Typeahead js 拆分我的 Twitter Bootstrap 3 输入组 每当我将 Typeahead javascript 指向属于输入组一部分的文本区域时 连接的文本区域和提交按钮就会停止连接 这只是 Typeahe
  • 设计 Javascript 前端 <-> C++ 后端通信

    在我最近的将来 我将不得不制作一个具有 C 后端和 Web 前端的系统 要求 目前 我对此了解不多 我认为前端将触发数据传输 而不是后端 所以不需要类似 Comet 的东西 由于在该领域的经验可能很少 我非常感谢您对我所做的设计决策的评论
  • 检查 href 中是否存在 jQuery 中的查询字符串

    我目前有一段 jQuery 用于附加带有一些位置信息的 URL jQuery a attr href function return this href location 123 abc 我的问题是大多数链接都有一个 其中使用上面的 就可以
  • 单击窗口后才检测到 keydown

    在我的 Web 应用程序中 我有一个用于打开菜单的键的事件侦听器 仅当我单击页面上的任意位置后 此功能才可以正常工作 我尝试将焦点添加到窗口加载 但这仍然不会让 keydown 函数运行 直到我单击页面上的某个位置之后 有谁知道这是否可能
  • 将 javascript 变量发送到服务器端 ASP .NET

    我需要在回发时将 JavaScript 数据传递到服务器端 Exvar jsVariableToPass new Object jsVariableToPass key1 value1 jsVariableToPass key2 value
  • 如何检查摘要周期是否稳定(又名“Angular 完成编译了吗?”)

    tl dr 最初的问题是 如何在每个摘要周期触发回调 但潜在的问题更有趣 因为这回答了两个问题 所以我继续修改了标题 Context 在解决了所有依赖项 nginclude API 调用等之后 我试图控制 Angular 何时完成 HTML
  • 可选链接在 create-react-app 中不起作用

    In a create react app项目 我正在使用 babel plugin proposal optional chaining在我的 babelrc中 但是 我有这个错误 Module parse failed Unexpect
  • 如何修复 AJAX 在选中复选框时始终触发?

    有时这个 AJAX 会触发 有时不会 让我解释一下 habit js document ready function habit check change function habit this parent siblings habit
  • 如何在 Javascript 中将字符串数组转换为特定的树结构

    我从后端获取文件路径列表 它代表文件夹结构 如下所示 paths path to file1 doc path to file2 doc foo bar doc 路径的长度是任意的 为了使用文件树组件 角度2树组件 https github
  • Safari 的 Javascript 与 document.write 的问题

    我的问题只发生在 Safari 上 IE FF Chrome 和 Opera 都可以完美运行 我正在向 DOM 添加一个对象 与 YouTube 的方式完全相同 具体取决于 ActiveX 或 NPAPI 因此在确定写入对象类型后 我通过以
  • 无需时间即可生成随机字符串?

    我知道如何使用 Runes 和播种 rand Init 在 go 中生成随机字符串time UnixNano 我的问题是 是否可以 使用 stdlib 在不使用当前时间戳 安全 的情况下播种 rand 此外 我问 因为仅仅依靠时间来为敏感操
  • 垃圾收集器不适用于 NodeJS / Chrome 中的类型化数组

    我最初将其记录为原项目中的一个问题 https github com nodejs help issues 3590 它立即转移到帮助主题 没有很好的解释 所以现在我想在这里提问 如果我们在 NodeJS v14 v16 v17 中运行以下
  • 截断段落前 100 个字符并隐藏段落的其余内容,以通过更多/更少链接显示/隐藏其余内容

    我有一个超过 500 个字符的段落 我只想获取最初的 100 个字符并隐藏其余部分 我还想在 100 个字符旁边插入 更多 链接 单击更多链接时 整个段落应显示并编辑文本 更多 到 更少 单击 更少 时 它应切换行为 段落是动态生成的 我无

随机推荐

  • 从触发器下载delphi中的文件并捕获文件名

    我有一个网站的网址 它看起来像这样 http www example com downloads file 4789 download http www example com downloads file 4789 download 我想
  • shouldOverrideUrlLoading 仅在某些网页上被调用

    我正在为针对多个客户端进行个性化的应用程序使用 shouldOverrideUrlLoading 方法 每个客户端都有自己的网页想要加载到 webview 中 我的问题是这样的 该应用程序非常适合客户 A 及其网页 但不适用于客户 B 的网
  • django-admin startproject尝试创建manage.py两次?

    我正在努力解决Django 教程 https docs djangoproject com en 1 9 intro tutorial01 版本 1 9 在 Ubuntu 15 10 上运行 当我到达跑步的台阶时django admin s
  • Express.js 无法 GET /index.html.var

    所以我在共享主机 FastComet 中运行一个快速应用程序 但如果我想访问 我会收到此消息 无法获取 index html var 显然这与 htaccess file 我解决这个问题的方法是添加 DirectoryIndex disab
  • 删除 iOS 7 中的 Tab Bar 水平分隔符

    我想删除 UITabBar 和屏幕其余部分之间的水平分隔线 我问和这个人有同样的问题 https stackoverflow com q 11104796 1224741但针对 iOS7 进行了更新 设置我的 UITabBar 的背景图像并
  • 使用mockito库模拟java中的final类[重复]

    这个问题在这里已经有答案了 我有一个最终类 它有一个我想执行特定操作的方法 因此我想创建最终类的对象 但我无法创建它 以下是我的课程 public final class A private String name A String nam
  • 在 Emacs 中搜索标记(选定)文本

    我使用 emacs 查看和编辑代码和其他文本文件 我想知道是否有一种方法可以向前或向后搜索当前缓冲区中标记的文本 类似于我在记事本或写字板中可以执行的操作 就像我可以在缓冲区中标记一些文本并执行 C s 或 C r 并能够使用标记的文本进行
  • 无法在画布上绘制垂直虚线

    我正在使用以下 javascript 算法在画布上绘制虚线 该算法正确绘制水平线 但无法绘制垂直线 g dashedLine function x y x2 y2 dashArray this beginPath this lineWidt
  • javascript 上的 localStorage 带来刷新

    我试图在空闲时关闭用户 在选项卡之间使用 javascript 下面的代码对于单个选项卡工作正常 对于多个选项卡它无法正常工作 例如 我设置了 10 秒作为空闲时间 并离开了第一个选项卡 它会在 10 秒内将用户抛出 假设我在以下位置打开了
  • 使用 babel 6 时,` __webpack_require__(...) 不是一个函数`

    一切似乎都建立得很好 http d pr i 1aZxR http d pr i 1aZxR使用以下配置 但是 当我运行代码时 出现以下错误 通过 webpack dev server Uncaught TypeError webpack
  • 如何在 R 中对行和列进行子集化

    我是R新手 在阅读 R in action 这本书时 遇到了一个问题 代码有什么区别newdata lt leadership order leadership age and newdata lt leadership order lea
  • 协变和逆变之间的区别

    我无法理解协变和逆变之间的区别 问题是 协变和逆变有什么区别 协变和逆变是将集合中的一个成员与另一个成员关联起来的映射函数 更具体地说 映射可以是协变的或逆变的relation在那一套上 考虑所有 C 类型集的以下两个子集 第一的 Anim
  • 存储目录结构的数据结构?

    我正在使用 struts 2 框架开发一个简单的 java web 应用程序 该应用程序的目的是使用JSP页面显示我的计算机下的特定目录结构 我的问题是使用哪种数据结构为了存储目录结构 以便 JSP 页面可以从操作类访问该目录结构对象 ps
  • 我应该从 Python 3.0 开始吗​​? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 最近我决定扩大我的编程视野并学习Python编程语言 虽然我在大学课程和工作中的一两个项目中使用过一点 Python 但我绝不是专家 我的问题如
  • 使用 Perl 正则表达式捕获 C 样式代码块之前和之后的文本

    我正在尝试使用 Perl 正则表达式捕获 C 样式代码块之前和之后的一些文本 到目前为止 这就是我所拥有的 use strict use warnings my text lt lt END int max int x int y if x
  • 可绘制选择器在 Jelly Bean 中不起作用

    我有一个可绘制的选择器作为每个项目的背景ListView以突出显示所选行 一切在冰淇淋三明治中都可以正常工作 但在果冻豆中似乎不起作用 找不到任何文档说明哪些更改可能导致它停止工作以及我需要做什么来修复它 不工作是指当我单击行中的一行时Li
  • 什么是聚合初始化?

    数组初始化 第 4 章第 231 页中的部分 Java 思维 第二版 有这样说 在 C 中初始化数组很容易出错且乏味 C 使用 聚合初始化以使其更安全 Java没有 像 C 一样的 聚合 因为 Java 中一切都是对象 确实如此 有数组 并
  • 斑马打印机可以直接打印pdf吗

    是否可以通过Java中的斑马打印机直接打印存储的pdf 我找不到任何提及它们与直接打印兼容的内容 而且我无法打印它 我需要直接通过 zpl 进行通信吗 通过 Acrobat Reader 打印时 zebra 打印机工作正常 Adobe Re
  • 是什么导致在 iOS 应用程序 UI 测试期间获取元素快照时出现错误 -25204

    我在 UI 测试期间收到以下错误 使用 iPhone 6 模拟器 Assertion Failure UI Testing Failure Failure getting snapshot Error Domain XCTestManage
  • Math.floor(Math.random() * (Max - Min + 1) + Min) 在 JavaScript 中如何工作? (理论)

    我正在学习 JavaScriptfreecodecamp org https www freecodecamp org 基本 JavaScript 在舞台上103 110有一个任务是创建一个带有 2 个参数 最小值和最大值 的函数 并且该函