_.random([lower=0], [upper=1], [floating])

190

_.random([lower=0], [upper=1], [floating])
_.random生成一个在lower和upper范围内包括lower和upper的随机数。如果范围只传递了一个参数,则会返回0到这个参数之间的随机数。如果floating参数是true,或者lower和upper其中之一是浮点数,那么返回结果也是浮点数。

参数

[lower=0] (number): 区间左端点
[upper=1] (number): 区间右端点
[floating] (boolean): 指定是否需要返回浮点类型

返回值

(number): 返回随机数

例子

 

_.random(0, 5);
// => an integer between 0 and 5
 
_.random(5);
// => also an integer between 0 and 5
 
_.random(5, true);
// => a floating-point number between 0 and 5
 
_.random(1.2, 5.2);
// => a floating-point number between 1.2 and 5.2

 

源代码

import toFinite from './toFinite.js'

/** Built-in method references without a dependency on `root`. */
const freeParseFloat = parseFloat

/**
 * Produces a random number between the inclusive `lower` and `upper` bounds.
 * If only one argument is provided a number between `0` and the given number
 * is returned. If `floating` is `true`, or either `lower` or `upper` are
 * floats, a floating-point number is returned instead of an integer.
 *
 * **Note:** JavaScript follows the IEEE-754 standard for resolving
 * floating-point values which can produce unexpected results.
 *
 * @since 0.7.0
 * @category Number
 * @param {number} [lower=0] The lower bound.
 * @param {number} [upper=1] The upper bound.
 * @param {boolean} [floating] Specify returning a floating-point number.
 * @returns {number} Returns the random number.
 * @see uniqueId
 * @example
 *
 * random(0, 5)
 * // => an integer between 0 and 5
 *
 * random(5)
 * // => also an integer between 0 and 5
 *
 * random(5, true)
 * // => a floating-point number between 0 and 5
 *
 * random(1.2, 5.2)
 * // => a floating-point number between 1.2 and 5.2
 */
//生成一个在lower和upper范围内包括lower和upper的随机数。如果范围只传递了一个参数,则会返回0到这个参数之间的随机数。如果floating参数是true,或者lower和upper其中之一是浮点数,那么返回结果也是浮点数。
function random(lower, upper, floating) {
  if (floating === undefined) {
    //如果floating参数没有传递,就去判断第二个参数是不是布尔值,如果是布尔值,则第二个参数作为floating
    if (typeof upper == 'boolean') {
      floating = upper
      upper = undefined
    }
    else if (typeof lower == 'boolean') {
      //如果第二个参数也不是布尔值,则判断第一个参数是不是布尔值,如果是就作为floating
      floating = lower
      lower = undefined
    }
  }
  if (lower === undefined && upper === undefined) {//区间的两个端点都没有传递,那么区间就是0到1
    lower = 0
    upper = 1
  }
  else {//如果区间至少有一个端点传递了参数
    lower = toFinite(lower)//将lower转换成有限的数字
    if (upper === undefined) {//如果upper没有传递,则区间为0到lower
      upper = lower
      lower = 0
    } else {//否则upper也转换成有限的数字
      upper = toFinite(upper)
    }
  }
  if (lower > upper) {//如果lower比upper大,互换位置
    const temp = lower
    lower = upper
    upper = temp
  }
  if (floating || lower % 1 || upper % 1) {//floating为true或者lower和upper中有一个是浮点数,则返回值也是浮点数
    const rand = Math.random()//0到1之间的随机数
    const randLength = `${rand}`.length - 1//随机数位数
    return Math.min(lower + (rand * (upper - lower + freeParseFloat(`1e-${randLength}`)), upper))
    //取 lower + 随机数 * upeer和lower之间的差距 和 upper 中最小的那个数作为返回值
  }
  return lower + Math.floor(Math.random() * (upper - lower + 1))
  //lower + 随机数 * upeer和lower之间的差距
}

export default random

 

 

posted @ 2020-08-12 10:22  hahazexia  阅读(234)  评论(0)    收藏  举报