• 从 min 到 max 的随机数


    一、从 min 到 max 的随机数

    内建函数 Math.random() 会创建一个在 0 到 1 之间(不包括 1)的随机数。
    编写一个 random(min, max) 函数,用以生成一个在 min 到 max 之间的随机浮点数(不包括 max))。
    我们需要将区间 0…1 中的所有值“映射”为范围在 min 到 max 中的值。

    这可以分两个阶段完成:

    1. 如果我们将 0…1 的随机数乘以 max-min,则随机数的范围将从 0…1 增加到 0..max-min
    2. 现在,如果我们将随机数与 min 相加,则随机数的范围将为 min 到 max。
    function random(min, max) {
      return min + Math.random() * (max - min);
    }
    
    • 1
    • 2
    • 3

    二、从 min 到 max 的随机整数

    创建一个函数 randomInteger(min, max),该函数会生成一个范围在 min 到 max 中的随机整数,包括 min 和 max。

    在 min…max 范围中的所有数字的出现概率必须相同。

    简单但错误的解决方案

    最简单但错误的解决方案是生成一个范围在 min 到 max 的值,并取对其进行四舍五入后的值:

    function randomInteger(min, max) {
      let rand = min + Math.random() * (max - min);
      return Math.round(rand);
    }
    
    • 1
    • 2
    • 3
    • 4

    这个函数是能起作用的,但不正确。获得边缘值 min 和 max 的概率比其他值低两倍。
    如果你将上面这个例子运行多次,你会很容易看到 2 出现的频率最高。
    发生这种情况是因为 Math.round() 从范围 1…3 中获得随机数,并按如下所示进行四舍五入:

    values from 1    ... to 1.4999999999  become 1
    values from 1.5  ... to 2.4999999999  become 2
    values from 2.5  ... to 2.9999999999  become 3
    
    • 1
    • 2
    • 3

    现在我们可以清楚地看到 1 的值比 2 少两倍。和 3 一样。

    正确的解决方案

    这个题目有很多正确的解决方案。其中之一是调整取值范围的边界。为了确保相同的取值范围,我们可以生成从 0.5 到 3.5 的值,从而将所需的概率添加到取值范围的边界:

    function randomInteger(min, max) {
      // 现在范围是从  (min-0.5) 到 (max+0.5)
      let rand = min - 0.5 + Math.random() * (max - min + 1);
      return Math.round(rand);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    另一种方法是使用 Math.floor 来取范围从 min 到 max+1 的随机数:

    function randomInteger(min, max) {
      // here rand is from min to (max+1)
      let rand = min + Math.random() * (max + 1 - min);
      return Math.floor(rand);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    现在所有间隔都以这种方式映射:

    values from 1  ... to 1.9999999999  become 1
    values from 2  ... to 2.9999999999  become 2
    values from 3  ... to 3.9999999999  become 3
    
    • 1
    • 2
    • 3

    所有间隔的长度相同,从而使最终能够均匀分配。

  • 相关阅读:
    堆结构的深度理解
    Vue3目录结构--源码解读(二)
    mmlab花朵分类结果展示(1)
    Android之自定义时间选择弹框
    前端面试题-javascript
    政企组织为什么更需要私有化的IM即时通讯平台?
    【Rust日报】2022-08-12 用 Rust 为 Linux 编写新的 Apple Silicon GPU 驱动程序
    基于HTML+CSS制作一个简单的家乡网页制作作业,广州介绍旅游网页设计代码 学生个人html静态网页制作成品代码
    不止跑路,拯救误操作rm -rf /*的小伙儿
    【Linux】——基操指令(一)
  • 原文地址:https://blog.csdn.net/a1056244734/article/details/126116911