Permalink
Cannot retrieve contributors at this time
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 | |
*/ | |
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 { | |
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)) | |
} | |
export default random |