UNPKG

es-toolkit

Version:

A state-of-the-art, high-performance JavaScript utility library with a small bundle size and strong type annotations.

59 lines (58 loc) 2.11 kB
import { random as random$1 } from "../../math/random.mjs"; import { randomInt } from "../../math/randomInt.mjs"; import { clamp } from "./clamp.mjs"; //#region src/compat/math/random.ts /** * Generate a random number within the given range. * * @param minimum - The lower bound (inclusive). * @param maximum - The upper bound (exclusive). * @returns A random number between minimum (inclusive) and maximum (exclusive). The number can be an integer or a decimal. * @throws {Error} Throws an error if `maximum` is not greater than `minimum`. * * @example * const result1 = random(0, 5); // Returns a random number between 0 and 5. * const result2 = random(5, 0); // If the minimum is greater than the maximum, an error is thrown. * const result3 = random(5, 5); // If the minimum is equal to the maximum, an error is thrown. */ function random(...args) { let minimum = 0; let maximum = 1; let floating = false; switch (args.length) { case 1: if (typeof args[0] === "boolean") floating = args[0]; else maximum = args[0]; break; case 2: if (typeof args[1] === "boolean") { maximum = args[0]; floating = args[1]; break; } else { minimum = args[0]; maximum = args[1]; } case 3: if (typeof args[2] === "object" && args[2] != null && args[2][args[1]] === args[0]) { minimum = 0; maximum = args[0]; floating = false; } else { minimum = args[0]; maximum = args[1]; floating = args[2]; } } if (typeof minimum !== "number") minimum = Number(minimum); if (typeof maximum !== "number") maximum = Number(maximum); if (!minimum) minimum = 0; if (!maximum) maximum = 0; if (minimum > maximum) [minimum, maximum] = [maximum, minimum]; if (!floating && (!Number.isInteger(minimum) || !Number.isInteger(maximum))) floating = true; minimum = clamp(minimum, -Number.MAX_SAFE_INTEGER, Number.MAX_SAFE_INTEGER); maximum = clamp(maximum, -Number.MAX_SAFE_INTEGER, Number.MAX_SAFE_INTEGER); if (minimum === maximum) return minimum; if (floating) return random$1(minimum, maximum); else return randomInt(minimum, maximum + 1); } //#endregion export { random };