当前位置: 代码迷 >> 综合 >> lodash 实现时的思路如下:
  详细解决方案

lodash 实现时的思路如下:

热度:41   发布时间:2024-02-20 06:43:05.0

function random(lower, upper, floating) {
// 判断给的参数够不够三个,在不够的情况下
if (floating === undefined) {
// 下面说明给了两个参数并且第二个是布尔值,修改参数为lower(不变), undefined, floating(原upper)
if (typeof upper === ‘boolean’) {
floating = upper;
upper = undefined;
}
// 下面说明给了一个参数并且是布尔值,修改参数为undefined, undefined, floating(原lower)
else if (typeof lower === ‘boolean’) {
floating = lower;
lower = undefined;
}
}

// 当参数为undefined, undefined, floating时,也就是只给了一个floating参数或者没给参数时
if (lower === undefined && upper === undefined) {
// 将参数修改为0, 1, floating,返回0,1之间的值
lower = 0;
upper = 1;
} else {
// 下面的情况是至少有两个参数
// 将lower改为有限数字
lower = toFinite(lower);
if (upper === undefined) {
// 有两个参数的情况,把upper改为lower,lower改为0
upper = lower;
lower = 0;
} else {
// 有三个参数时,就将参数有限化
upper = toFinite(upper);
}
}
// 经过上面一系列处理,如果lower比upper大,就交换下
if (lower > upper) {
const temp = lower;
lower = upper;
upper = temp;
}

// 处理到这里时,已经变成正规的全参数的输入了。下面就是对random逻辑的处理

// 如果floating为真,或者lower upper为浮点数,就返回浮点数
if (floating || lower % 1 || upper % 1) {
// 0-1的随机数
const rand = Math.random();
// 随机数长度
const randLength = ${rand}.length - 1;
// 返回随机浮点数
// freeParseFloat(1e-${randLength})的操作是为了确保必为浮点数。
// ??存疑当rand为0时还是返回0
return Math.min(
lower + rand * (upper - lower + freeParseFloat(1e-${randLength})),
upper
);
}
// 否则返回整数随机数,常规随机数操作
return lower + Math.floor(Math.random() * (upper - lower + 1));
}
function random(lower, upper, floating) {
// 判断给的参数够不够三个,在不够的情况下
if (floating === undefined) {
// 下面说明给了两个参数并且第二个是布尔值,修改参数为lower(不变), undefined, floating(原upper)
if (typeof upper === ‘boolean’) {
floating = upper;
upper = undefined;
}
// 下面说明给了一个参数并且是布尔值,修改参数为undefined, undefined, floating(原lower)
else if (typeof lower === ‘boolean’) {
floating = lower;
lower = undefined;
}
}

// 当参数为undefined, undefined, floating时,也就是只给了一个floating参数或者没给参数时
if (lower === undefined && upper === undefined) {
// 将参数修改为0, 1, floating,返回0,1之间的值
lower = 0;
upper = 1;
} else {
// 下面的情况是至少有两个参数
// 将lower改为有限数字
lower = toFinite(lower);
if (upper === undefined) {
// 有两个参数的情况,把upper改为lower,lower改为0
upper = lower;
lower = 0;
} else {
// 有三个参数时,就将参数有限化
upper = toFinite(upper);
}
}
// 经过上面一系列处理,如果lower比upper大,就交换下
if (lower > upper) {
const temp = lower;
lower = upper;
upper = temp;
}

// 处理到这里时,已经变成正规的全参数的输入了。下面就是对random逻辑的处理

// 如果floating为真,或者lower upper为浮点数,就返回浮点数
if (floating || lower % 1 || upper % 1) {
// 0-1的随机数
const rand = Math.random();
// 随机数长度
const randLength = ${rand}.length - 1;
// 返回随机浮点数
// freeParseFloat(1e-${randLength})的操作是为了确保必为浮点数。
// ??存疑当rand为0时还是返回0
return Math.min(
lower + rand * (upper - lower + freeParseFloat(1e-${randLength})),
upper
);
}
// 否则返回整数随机数,常规随机数操作
return lower + Math.floor(Math.random() * (upper - lower + 1));
}