random
依赖
import toFinite from './toFinite.js';源码
/**内置方法引用,不依赖于`root`。 */
const freeParseFloat = parseFloat;
/**
* 产生一个包括 lower 与 upper 之间的数。 如果只提供一个参数返回一个0到提供数之间的数。
* 如果 floating 设为 true,或者 lower 或 upper 是浮点数,结果返回浮点数。
*
* 注意: JavaScript 遵循 IEEE-754 标准处理无法预料的浮点数结果。
*
* @since 0.7.0
* @category Number
* @param {number} [lower=0] 下限。
* @param {number} [upper=1] 上限。
* @param {boolean} [floating] 指定是否返回浮点数。
* @returns {number} 返回随机数。
*/
function random(lower, upper, floating) {
// 适配可选参数变量
if (floating === undefined) {
if (typeof upper == 'boolean') {
floating = upper;
upper = undefined;
} else if (typeof lower == 'boolean') {
floating = lower;
lower = undefined;
}
}
if (lower === undefined && upper === undefined) {
lower = 0;
upper = 1;
} else {
// 兼容 Infinity、-Infinity 情况
lower = toFinite(lower);
if (upper === undefined) {
upper = lower;
lower = 0;
} else {
upper = toFinite(upper);
}
}
// 转换负范围
if (lower > upper) {
const temp = lower;
lower = upper;
upper = temp;
}
// 判断是否返回浮点数结果
if (floating || lower % 1 || upper % 1) {
const rand = Math.random();
const randLength = `${rand}`.length - 1;
return Math.min(lower + (rand * (upper - lower + freeParseFloat(`1e-${randLength}`)), upper));
}
return lower + Math.floor(Math.random() * (upper - lower + 1));
}原理
相关链接
参考
Last updated