number/random.js

import is_number from '../is/number.js';
import is_float from '../is/float.js';

/**
 * 获取2个数之间的随机数
 * 
 * @alias number_random
 * @category number
 * 
 * @param {number} lower - 最小值
 * @param {number} [upper] - 最大值
 * @param {boolean} [isFloat=false] - 是否浮点数
 * 
 * @returns {number} - 随机数
 * 
 * @author xkloveme <xkloveme@gmail.com>
 * 
 * @summary 产生一个包括 lower 与 upper 之间的数。
 * 如果只提供一个参数返回一个0到提供数之间的数。
 * 如果 isFloat 设为 true,或者 lower 或 upper 是浮点数,结果返回浮点数。
 */
export default function number_random(lower, upper, isFloat = false) {
  // 参数验证
  if (!is_number(lower) || (upper !== undefined && !is_number(upper))) {
    throw new TypeError('Both lower and upper must be numbers.');
  }

  // 处理单参数情况
  if (upper === undefined) {
    upper = lower;
    lower = 0;
  }

  // 如果下限大于上限,交换它们
  if (lower > upper) {
    [lower, upper] = [upper, lower];
  }

  // 判断是否返回浮点数
  const shouldReturnFloat = isFloat || is_float(lower) || is_float(upper);

  if (shouldReturnFloat) {
    return Math.random() * (upper - lower) + lower;
  } else {
    return Math.floor(Math.random() * (upper - lower + 1)) + lower;
  }
}