_.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