isaacscript-common
Version:
Helper functions and features for IsaacScript mods.
90 lines (89 loc) • 3.44 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.getRandom = getRandom;
exports.getRandomFloat = getRandomFloat;
exports.getRandomInt = getRandomInt;
const ReadonlySet_1 = require("../types/ReadonlySet");
const rng_1 = require("./rng");
/**
* Returns a random float between 0 and 1. It is inclusive on the low end, but exclusive on the high
* end. (This is because the `RNG.RandomFloat` method will never return a value of exactly 1.)
*
* If you want to generate an unseeded number, you must explicitly pass `undefined` to the
* `seedOrRNG` parameter.
*
* @param seedOrRNG The `Seed` or `RNG` object to use. If an `RNG` object is provided, the
* `RNG.Next` method will be called. If `undefined` is provided, it will default to
* a random seed.
*/
function getRandom(seedOrRNG) {
const rng = (0, rng_1.isRNG)(seedOrRNG) ? seedOrRNG : (0, rng_1.newRNG)(seedOrRNG);
return rng.RandomFloat();
}
/**
* Returns a random float between min and max.
*
* For example:
*
* ```ts
* const realNumberBetweenOneAndThree = getRandomFloat(1, 3, undefined);
* ```
*
* If you want to generate an unseeded number, you must explicitly pass `undefined` to the
* `seedOrRNG` parameter.
*
* @param min The lower bound for the random number (inclusive).
* @param max The upper bound for the random number (exclusive).
* @param seedOrRNG The `Seed` or `RNG` object to use. If an `RNG` object is provided, the
* `RNG.Next` method will be called. If `undefined` is provided, it will default to
* a random seed.
*/
function getRandomFloat(min, max, seedOrRNG) {
if (min > max) {
const oldMin = min;
const oldMax = max;
min = oldMax;
max = oldMin;
}
// From: https://stackoverflow.com/questions/40431966
return min + getRandom(seedOrRNG) * (max - min);
}
/**
* Returns a random integer between min and max. It is inclusive on both ends.
*
* For example:
*
* ```ts
* const oneTwoOrThree = getRandomInt(1, 3);
* ```
*
* If you want to generate an unseeded number, you must explicitly pass `undefined` to the
* `seedOrRNG` parameter.
*
* @param min The lower bound for the random number (inclusive).
* @param max The upper bound for the random number (inclusive).
* @param seedOrRNG The `Seed` or `RNG` object to use. If an `RNG` object is provided, the
* `RNG.Next` method will be called. If `undefined` is provided, it will default to
* a random seed.
* @param exceptions Optional. An array of elements that will be skipped over when getting the
* random integer. For example, a min of 1, a max of 4, and an exceptions array of
* `[2]` would cause the function to return either 1, 3, or 4. Default is an empty
* array.
*/
function getRandomInt(min, max, seedOrRNG, exceptions = []) {
const rng = (0, rng_1.isRNG)(seedOrRNG) ? seedOrRNG : (0, rng_1.newRNG)(seedOrRNG);
min = Math.ceil(min);
max = Math.floor(max);
if (min > max) {
const oldMin = min;
const oldMax = max;
min = oldMax;
max = oldMin;
}
const exceptionsSet = new ReadonlySet_1.ReadonlySet(exceptions);
let randomInt;
do {
randomInt = rng.RandomInt(max - min + 1) + min;
} while (exceptionsSet.has(randomInt));
return randomInt;
}