random
Version:
Seedable random number generator supporting many common distributions.
1 lines • 38.5 kB
Source Map (JSON)
{"version":3,"sources":["../src/index.ts","../src/rng.ts","../src/generators/function.ts","../src/utils.ts","../src/generators/arc4.ts","../src/generators/math-random.ts","../src/generators/xor128.ts","../src/validation.ts","../src/distributions/bates.ts","../src/distributions/bernoulli.ts","../src/distributions/binomial.ts","../src/distributions/exponential.ts","../src/distributions/geometric.ts","../src/distributions/irwin-hall.ts","../src/distributions/log-normal.ts","../src/distributions/normal.ts","../src/distributions/pareto.ts","../src/distributions/poisson.ts","../src/distributions/uniform.ts","../src/distributions/uniform-boolean.ts","../src/distributions/uniform-int.ts","../src/distributions/weibull.ts","../src/random.ts"],"sourcesContent":["export * from './generators'\nexport * from './random'\nexport { default } from './random'\nexport * from './rng'\nexport type * from './types'\nexport * from './utils'\n","export abstract class RNG {\n abstract get name(): string\n\n abstract next(): number\n\n abstract clone(): RNG\n}\n","import type { RNGFn } from '../types'\nimport { RNG } from '../rng'\n\nexport class FunctionRNG extends RNG {\n _name: string\n _rngFn: RNGFn\n\n constructor(rngFn: RNGFn) {\n super()\n\n this._name = rngFn.name ?? 'function'\n this._rngFn = rngFn\n }\n\n override get name() {\n return this._name\n }\n\n override next() {\n return this._rngFn()\n }\n\n override clone() {\n return new FunctionRNG(this._rngFn)\n }\n}\n","import type { Seed, SeedOrRNG } from './types'\nimport { ARC4RNG } from './generators/arc4'\nimport { FunctionRNG } from './generators/function'\nimport { RNG } from './rng'\n\nexport function createRNG(seedOrRNG?: SeedOrRNG) {\n switch (typeof seedOrRNG) {\n case 'object':\n if (seedOrRNG instanceof RNG) {\n return seedOrRNG\n }\n break\n\n case 'function':\n return new FunctionRNG(seedOrRNG)\n\n default:\n return new ARC4RNG(seedOrRNG)\n }\n\n throw new Error(`invalid RNG seed or instance \"${seedOrRNG}\"`)\n}\n\n/**\n * Mixes a string seed into a key that is an array of integers, and returns a\n * shortened string seed that is equivalent to the result key.\n */\nexport function mixKey(seed: Seed, key: number[]): number[] {\n const seedStr = `${seed}`\n let smear = 0\n let j = 0\n\n while (j < seedStr.length) {\n key[0xff & j] =\n 0xff & ((smear ^= (key[0xff & j] ?? 0) * 19) + seedStr.charCodeAt(j++))\n }\n\n if (!key.length) {\n return [0]\n }\n\n return key\n}\n\nexport function shuffleInPlace<T>(gen: RNG, array: Array<T>) {\n for (let i = array.length - 1; i > 0; i -= 1) {\n const j = Math.floor(gen.next() * (i + 1))\n const tmp = array[i]\n array[i] = array[j] as T\n array[j] = tmp as T\n }\n}\n","import type { Seed } from '../types'\nimport { RNG } from '../rng'\nimport { mixKey } from '../utils'\n\n//\n// ARC4\n//\n// An ARC4 implementation. The constructor takes a key in the form of an array\n// of at most (width) integers that should be 0 <= x < (width).\n//\n// The g(count) method returns a pseudorandom integer that concatenates the\n// next (count) outputs from ARC4. Its return value is a number x that is in\n// the range 0 <= x < (width ^ count).\n\n// The following constants are related to IEEE 754 limits.\n// const width = 256 // each RC4 output is 0 <= x < 256\n// const chunks = 6 // at least six RC4 outputs for each double\nconst _arc4_startdenom = 281_474_976_710_656 // 256 ** 6 == width ** chunks\nconst _arc4_significance = 4_503_599_627_370_496 // 2 ** 52 significant digits in a double\nconst _arc4_overflow = 9_007_199_254_740_992 // 2 ** 53 == significance * 2\n\nexport class ARC4RNG extends RNG {\n protected readonly _seed: Seed\n\n i: number\n j: number\n S: number[]\n\n constructor(seed: Seed = crypto.randomUUID()) {\n super()\n\n this._seed = seed\n const key = mixKey(seed, [])\n\n const S: number[] = []\n const keylen = key.length\n this.i = 0\n this.j = 0\n this.S = S\n\n // Set up S using the standard key scheduling algorithm.\n let i = 0\n while (i <= 0xff) {\n S[i] = i++\n }\n\n for (let i = 0, j = 0; i <= 0xff; i++) {\n const t = S[i]!\n j = 0xff & (j + key[i % keylen]! + t)\n S[i] = S[j]!\n S[j] = t\n }\n\n // For more robust unpredictability, the function call below discards an\n // initial batch of values. This is called RC4-drop.\n this.g(256)\n }\n\n override get name() {\n return 'arc4'\n }\n\n override next() {\n // This function returns a random double in [0, 1) that contains\n // randomness in every bit of the mantissa of the IEEE 754 value.\n\n let n = this.g(6) // Start with a numerator n < 2 ^ 48\n let d = _arc4_startdenom // and denominator d = 2 ^ 48.\n let x = 0 // and no 'extra last byte'.\n\n while (n < _arc4_significance) {\n // Fill up all significant digits (2 ** 52)\n n = (n + x) * 256 // by shifting numerator and\n d *= 256 // denominator and generating a\n x = this.g(1) // new least-significant-byte.\n }\n\n while (n >= _arc4_overflow) {\n // To avoid rounding past overflow, before adding\n n /= 2 // last byte, shift everything\n d /= 2 // right using integer math until\n x >>>= 1 // we have exactly the desired bits.\n }\n\n return (n + x) / d // Form the number within [0, 1).\n }\n\n g(count: number) {\n const { S } = this\n let { i, j } = this\n let r = 0\n\n while (count--) {\n i = 0xff & (i + 1)\n const t = S[i]!\n S[j] = t\n j = 0xff & (j + t)\n S[i] = S[j]!\n r = r * 256 + S[0xff & (S[i]! + t)]!\n }\n\n this.i = i\n this.j = j\n\n return r\n }\n\n override clone() {\n return new ARC4RNG(this._seed)\n }\n}\n","import { RNG } from '../rng'\n\nexport class MathRandomRNG extends RNG {\n override get name() {\n return 'Math.random'\n }\n\n override next() {\n return Math.random()\n }\n\n override clone() {\n return new MathRandomRNG()\n }\n}\n","import type { Seed } from '../types'\nimport { RNG } from '../rng'\n\nexport class XOR128RNG extends RNG {\n protected readonly _seed: Seed\n\n x: number\n y: number\n z: number\n w: number\n\n constructor(seed: Seed = crypto.randomUUID()) {\n super()\n\n this._seed = seed\n this.x = 0\n this.y = 0\n this.z = 0\n this.w = 0\n\n let strSeed: string = ''\n\n if (typeof seed === 'number') {\n this.x = seed\n } else {\n strSeed += `${seed}`\n }\n\n // Mix in string seed, then discard an initial batch of 64 values.\n for (let i = 0; i < strSeed.length + 64; ++i) {\n this.x ^= strSeed.charCodeAt(i) | 0\n this.next()\n }\n }\n\n override get name() {\n return 'xor128'\n }\n\n override next() {\n const t = this.x ^ (this.x << 11)\n this.x = this.y\n this.y = this.z\n this.z = this.w\n this.w = this.w ^ ((this.w >>> 19) ^ t ^ (t >>> 8))\n return (this.w >>> 0) / 0x1_00_00_00_00\n }\n\n override clone() {\n return new XOR128RNG(this._seed)\n }\n}\n","export function numberValidator(num: number) {\n return new NumberValidator(num)\n}\n\nexport class NumberValidator {\n private n: number\n constructor(num: number) {\n this.n = num\n }\n\n public isInt = (): this => {\n if (Number.isInteger(this.n)) {\n return this\n }\n throw new Error(`Expected number to be an integer, got ${this.n}`)\n }\n\n public isPositive = (): this => {\n if (this.n > 0) {\n return this\n }\n throw new Error(`Expected number to be positive, got ${this.n}`)\n }\n\n public lessThan = (v: number): this => {\n if (this.n < v) {\n return this\n }\n throw new Error(`Expected number to be less than ${v}, got ${this.n}`)\n }\n\n public greaterThanOrEqual = (v: number): this => {\n if (this.n >= v) {\n return this\n }\n throw new Error(\n `Expected number to be greater than or equal to ${v}, got ${this.n}`\n )\n }\n\n public greaterThan = (v: number): this => {\n if (this.n > v) {\n return this\n }\n throw new Error(`Expected number to be greater than ${v}, got ${this.n}`)\n }\n}\n","import type { Random } from '../random'\nimport { numberValidator } from '../validation'\n\nexport function bates(random: Random, n = 1) {\n numberValidator(n).isInt().isPositive()\n const irwinHall = random.irwinHall(n)\n\n return () => {\n return irwinHall() / n\n }\n}\n","import type { Random } from '../random'\nimport { numberValidator } from '../validation'\n\nexport function bernoulli(random: Random, p = 0.5) {\n numberValidator(p).greaterThanOrEqual(0).lessThan(1)\n\n return () => {\n return Math.floor(random.next() + p)\n }\n}\n","import type { Random } from '../random'\nimport { numberValidator } from '../validation'\n\nexport function binomial(random: Random, n = 1, p = 0.5) {\n numberValidator(n).isInt().isPositive()\n numberValidator(p).greaterThanOrEqual(0).lessThan(1)\n\n return () => {\n let i = 0\n let x = 0\n\n while (i++ < n) {\n if (random.next() < p) {\n x++\n }\n }\n return x\n }\n}\n","import type { Random } from '../random'\nimport { numberValidator } from '../validation'\n\nexport function exponential(random: Random, lambda = 1) {\n numberValidator(lambda).isPositive()\n\n return () => {\n return -Math.log(1 - random.next()) / lambda\n }\n}\n","import type { Random } from '../random'\nimport { numberValidator } from '../validation'\n\nexport function geometric(random: Random, p = 0.5) {\n numberValidator(p).greaterThan(0).lessThan(1)\n const invLogP = 1.0 / Math.log(1.0 - p)\n\n return () => {\n return Math.floor(1 + Math.log(random.next()) * invLogP)\n }\n}\n","import type { Random } from '../random'\nimport { numberValidator } from '../validation'\n\nexport function irwinHall(random: Random, n = 1) {\n numberValidator(n).isInt().greaterThanOrEqual(0)\n\n return () => {\n let sum = 0\n for (let i = 0; i < n; ++i) {\n sum += random.next()\n }\n\n return sum\n }\n}\n","import type { Random } from '../random'\n\nexport function logNormal(random: Random, mu = 0, sigma = 1) {\n const normal = random.normal(mu, sigma)\n return () => {\n return Math.exp(normal())\n }\n}\n","import type { Random } from '../random'\n\nexport function normal(random: Random, mu = 0, sigma = 1) {\n return () => {\n let x: number, y: number, r: number\n\n do {\n x = random.next() * 2 - 1\n y = random.next() * 2 - 1\n r = x * x + y * y\n } while (!r || r > 1)\n\n return mu + sigma * y * Math.sqrt((-2 * Math.log(r)) / r)\n }\n}\n","import type { Random } from '../random'\nimport { numberValidator } from '../validation'\n\nexport function pareto(random: Random, alpha = 1) {\n numberValidator(alpha).greaterThanOrEqual(0)\n const invAlpha = 1.0 / alpha\n\n return () => {\n return 1.0 / Math.pow(1.0 - random.next(), invAlpha)\n }\n}\n","import type { Random } from '../random'\nimport { numberValidator } from '../validation'\n\nconst logFactorialTable = [\n 0.0, 0.0, 0.693_147_180_559_945_29, 1.791_759_469_228_055,\n 3.178_053_830_347_945_8, 4.787_491_742_782_045_8, 6.579_251_212_010_101_2,\n 8.525_161_361_065_414_7, 10.604_602_902_745_251, 12.801_827_480_081_469\n]\n\nconst logFactorial = (k: number) => {\n return logFactorialTable[k]\n}\n\nconst logSqrt2PI = 0.918_938_533_204_672_67\n\nexport function poisson(random: Random, lambda = 1) {\n numberValidator(lambda).isPositive()\n\n if (lambda < 10) {\n // inversion method\n const expMean = Math.exp(-lambda)\n\n return () => {\n let p = expMean\n let x = 0\n let u = random.next()\n\n while (u > p) {\n u = u - p\n p = (lambda * p) / ++x\n }\n\n return x\n }\n } else {\n // generative method\n const smu = Math.sqrt(lambda)\n const b = 0.931 + 2.53 * smu\n const a = -0.059 + 0.024_83 * b\n const invAlpha = 1.1239 + 1.1328 / (b - 3.4)\n const vR = 0.9277 - 3.6224 / (b - 2)\n\n return () => {\n while (true) {\n let u\n let v = random.next()\n\n if (v <= 0.86 * vR) {\n u = v / vR - 0.43\n return Math.floor(\n ((2 * a) / (0.5 - Math.abs(u)) + b) * u + lambda + 0.445\n )\n }\n\n if (v >= vR) {\n u = random.next() - 0.5\n } else {\n u = v / vR - 0.93\n u = (u < 0 ? -0.5 : 0.5) - u\n v = random.next() * vR\n }\n\n const us = 0.5 - Math.abs(u)\n if (us < 0.013 && v > us) {\n continue\n }\n\n const k = Math.floor(((2 * a) / us + b) * u + lambda + 0.445)\n v = (v * invAlpha) / (a / (us * us) + b)\n\n if (k >= 10) {\n const t =\n (k + 0.5) * Math.log(lambda / k) -\n lambda -\n logSqrt2PI +\n k -\n (1 / 12.0 - (1 / 360.0 - 1 / (1260.0 * k * k)) / (k * k)) / k\n\n if (Math.log(v * smu) <= t) {\n return k\n }\n } else if (k >= 0) {\n const f = logFactorial(k) ?? 0\n\n if (Math.log(v) <= k * Math.log(lambda) - lambda - f) {\n return k\n }\n }\n }\n }\n }\n}\n","import type { Random } from '../random'\n\nexport function uniform(random: Random, min = 0, max = 1) {\n return () => {\n return random.next() * (max - min) + min\n }\n}\n","import type { Random } from '../random'\n\nexport function uniformBoolean(random: Random) {\n return () => {\n return random.next() >= 0.5\n }\n}\n","import type { Random } from '../random'\nimport { numberValidator } from '../validation'\n\nexport function uniformInt(random: Random, min = 0, max = 1) {\n if (max === undefined) {\n max = min === undefined ? 1 : min\n min = 0\n }\n\n numberValidator(min).isInt()\n numberValidator(max).isInt()\n\n return () => {\n return Math.floor(random.next() * (max - min + 1) + min)\n }\n}\n","import type { Random } from '../random'\nimport { numberValidator } from '../validation'\n\nexport function weibull(random: Random, lambda: number, k: number) {\n numberValidator(lambda).greaterThan(0.0)\n numberValidator(k).greaterThan(0.0)\n return () => {\n const u = 1.0 - random.next()\n return lambda * Math.pow(-Math.log(u), 1.0 / k)\n }\n}\n","import type { RNG } from './rng'\nimport type { SeedOrRNG } from './types'\nimport { bates } from './distributions/bates'\nimport { bernoulli } from './distributions/bernoulli'\nimport { binomial } from './distributions/binomial'\nimport { exponential } from './distributions/exponential'\nimport { geometric } from './distributions/geometric'\nimport { irwinHall } from './distributions/irwin-hall'\nimport { logNormal } from './distributions/log-normal'\nimport { normal } from './distributions/normal'\nimport { pareto } from './distributions/pareto'\nimport { poisson } from './distributions/poisson'\nimport { uniform } from './distributions/uniform'\nimport { uniformBoolean } from './distributions/uniform-boolean'\nimport { uniformInt } from './distributions/uniform-int'\nimport { weibull } from './distributions/weibull'\nimport { MathRandomRNG } from './generators/math-random'\nimport { createRNG, shuffleInPlace } from './utils'\n\n/**\n * Distribution function\n */\ntype IDistFn<R> = (random: Random, ...argv: any) => R\n\n/**\n * Distribution\n */\ntype IDist<R> = () => R\n\n/**\n * Keyed cache entry\n */\ninterface ICacheEntry<T> {\n key: string\n distribution: () => T\n}\n\n/**\n * Seedable random number generator supporting many common distributions.\n *\n * @name Random\n * @class\n *\n * @param {RNG|function|string|number} [rng=Math.random] - Underlying random number generator or a seed for the default PRNG. Defaults to `Math.random`.\n */\nexport class Random {\n protected _rng!: RNG\n protected _cache: {\n [k: string]: ICacheEntry<any>\n } = {}\n\n constructor(seedOrRNG: SeedOrRNG = new MathRandomRNG()) {\n this._rng = createRNG(seedOrRNG)\n }\n\n /**\n * @member {RNG} rng - Underlying pseudo-random number generator.\n */\n get rng() {\n return this._rng\n }\n\n /**\n * Creates a new `Random` instance, optionally specifying parameters to\n * set a new seed.\n */\n clone(seedOrRNG: SeedOrRNG = this.rng.clone()): Random {\n return new Random(seedOrRNG)\n }\n\n /**\n * Sets the underlying pseudorandom number generator.\n *\n * @example\n * ```ts\n * import random from 'random'\n *\n * random.use('example-seed')\n * // or\n * random.use(Math.random)\n * ```\n */\n use(seedOrRNG: SeedOrRNG) {\n this._rng = createRNG(seedOrRNG)\n this._cache = {}\n }\n\n // --------------------------------------------------------------------------\n // Uniform utility functions\n // --------------------------------------------------------------------------\n\n /**\n * Convenience wrapper around `this.rng.next()`\n *\n * Returns a floating point number in [0, 1).\n *\n * @return {number}\n */\n next(): number {\n return this._rng.next()\n }\n\n /**\n * Samples a uniform random floating point number, optionally specifying\n * lower and upper bounds.\n *\n * Convenience wrapper around `random.uniform()`\n *\n * @param {number} [min=0] - Lower bound (float, inclusive)\n * @param {number} [max=1] - Upper bound (float, exclusive)\n */\n float(min?: number, max?: number): number {\n return this.uniform(min, max)()\n }\n\n /**\n * Samples a uniform random integer, optionally specifying lower and upper\n * bounds.\n *\n * Convenience wrapper around `random.uniformInt()`\n *\n * @param {number} [min=0] - Lower bound (integer, inclusive)\n * @param {number} [max=1] - Upper bound (integer, inclusive)\n */\n int(min?: number, max?: number): number {\n return this.uniformInt(min, max)()\n }\n\n /**\n * Samples a uniform random integer, optionally specifying lower and upper\n * bounds.\n *\n * Convenience wrapper around `random.uniformInt()`\n *\n * @alias `random.int`\n *\n * @param {number} [min=0] - Lower bound (integer, inclusive)\n * @param {number} [max=1] - Upper bound (integer, inclusive)\n */\n integer(min?: number, max?: number): number {\n return this.uniformInt(min, max)()\n }\n\n /**\n * Samples a uniform random boolean value.\n *\n * Convenience wrapper around `random.uniformBoolean()`\n *\n * @alias `random.boolean`\n */\n bool(): boolean {\n return this.uniformBoolean()()\n }\n\n /**\n * Samples a uniform random boolean value.\n *\n * Convenience wrapper around `random.uniformBoolean()`\n */\n boolean(): boolean {\n return this.uniformBoolean()()\n }\n\n /**\n * Returns an item chosen uniformly at random from the given array.\n *\n * Convenience wrapper around `random.uniformInt()`\n *\n * @param {Array<T>} [array] - Input array\n */\n choice<T>(array: Array<T>): T | undefined {\n if (!Array.isArray(array)) {\n throw new TypeError(\n `Random.choice expected input to be an array, got ${typeof array}`\n )\n }\n\n const length = array.length\n\n if (length > 0) {\n const index = this.uniformInt(0, length - 1)()\n return array[index]\n } else {\n return undefined\n }\n }\n /**\n * Returns a shuffled copy of the given array.\n *\n * @param {Array<T>} [array] - Input array\n */\n shuffle<T>(array: Array<T>): Array<T> {\n if (!Array.isArray(array)) {\n throw new TypeError(\n `Random.shuffle expected input to be an array, got ${typeof array}`\n )\n }\n\n const copy = [...array]\n shuffleInPlace(this.rng, copy)\n\n return copy\n }\n\n /**\n * Generates a thunk which returns shuffled copies of the given array.\n *\n * @param {Array<T>} [array] - Input array\n */\n shuffler<T>(array: Array<T>): () => Array<T> {\n if (!Array.isArray(array)) {\n throw new TypeError(\n `Random.shuffler expected input to be an array, got ${typeof array}`\n )\n }\n\n const gen = this.rng\n const copy = [...array]\n\n return () => {\n shuffleInPlace(gen, copy)\n return [...copy]\n }\n }\n\n // --------------------------------------------------------------------------\n // Uniform distributions\n // --------------------------------------------------------------------------\n\n /**\n * Generates a [Continuous uniform distribution](https://en.wikipedia.org/wiki/Uniform_distribution_(continuous)).\n *\n * @param {number} [min=0] - Lower bound (float, inclusive)\n * @param {number} [max=1] - Upper bound (float, exclusive)\n */\n uniform(min?: number, max?: number): IDist<number> {\n return this._memoize<number>('uniform', uniform, min, max)\n }\n\n /**\n * Generates a [Discrete uniform distribution](https://en.wikipedia.org/wiki/Discrete_uniform_distribution).\n *\n * @param {number} [min=0] - Lower bound (integer, inclusive)\n * @param {number} [max=1] - Upper bound (integer, inclusive)\n */\n uniformInt(min?: number, max?: number): IDist<number> {\n return this._memoize<number>('uniformInt', uniformInt, min, max)\n }\n\n /**\n * Generates a [Discrete uniform distribution](https://en.wikipedia.org/wiki/Discrete_uniform_distribution),\n * with two possible outcomes, `true` or `false.\n *\n * This method is analogous to flipping a coin.\n */\n uniformBoolean(): IDist<boolean> {\n return this._memoize<boolean>('uniformBoolean', uniformBoolean)\n }\n\n // --------------------------------------------------------------------------\n // Normal distributions\n // --------------------------------------------------------------------------\n\n /**\n * Generates a [Normal distribution](https://en.wikipedia.org/wiki/Normal_distribution).\n *\n * @param {number} [mu=0] - Mean\n * @param {number} [sigma=1] - Standard deviation\n */\n normal(mu?: number, sigma?: number): IDist<number> {\n return normal(this, mu, sigma)\n }\n\n /**\n * Generates a [Log-normal distribution](https://en.wikipedia.org/wiki/Log-normal_distribution).\n *\n * @param {number} [mu=0] - Mean of underlying normal distribution\n * @param {number} [sigma=1] - Standard deviation of underlying normal distribution\n */\n logNormal(mu?: number, sigma?: number): IDist<number> {\n return logNormal(this, mu, sigma)\n }\n\n // --------------------------------------------------------------------------\n // Bernoulli distributions\n // --------------------------------------------------------------------------\n\n /**\n * Generates a [Bernoulli distribution](https://en.wikipedia.org/wiki/Bernoulli_distribution).\n *\n * @param {number} [p=0.5] - Success probability of each trial.\n */\n bernoulli(p?: number): IDist<number> {\n return bernoulli(this, p)\n }\n\n /**\n * Generates a [Binomial distribution](https://en.wikipedia.org/wiki/Binomial_distribution).\n *\n * @param {number} [n=1] - Number of trials.\n * @param {number} [p=0.5] - Success probability of each trial.\n */\n binomial(n?: number, p?: number): IDist<number> {\n return binomial(this, n, p)\n }\n\n /**\n * Generates a [Geometric distribution](https://en.wikipedia.org/wiki/Geometric_distribution).\n *\n * @param {number} [p=0.5] - Success probability of each trial.\n */\n geometric(p?: number): IDist<number> {\n return geometric(this, p)\n }\n\n // --------------------------------------------------------------------------\n // Poisson distributions\n // --------------------------------------------------------------------------\n\n /**\n * Generates a [Poisson distribution](https://en.wikipedia.org/wiki/Poisson_distribution).\n *\n * @param {number} [lambda=1] - Mean (lambda > 0)\n */\n poisson(lambda?: number): IDist<number> {\n return poisson(this, lambda)\n }\n\n /**\n * Generates an [Exponential distribution](https://en.wikipedia.org/wiki/Exponential_distribution).\n *\n * @param {number} [lambda=1] - Inverse mean (lambda > 0)\n */\n exponential(lambda?: number): IDist<number> {\n return exponential(this, lambda)\n }\n\n // --------------------------------------------------------------------------\n // Misc distributions\n // --------------------------------------------------------------------------\n\n /**\n * Generates an [Irwin Hall distribution](https://en.wikipedia.org/wiki/Irwin%E2%80%93Hall_distribution).\n *\n * @param {number} [n=1] - Number of uniform samples to sum (n >= 0)\n */\n irwinHall(n?: number): IDist<number> {\n return irwinHall(this, n)\n }\n\n /**\n * Generates a [Bates distribution](https://en.wikipedia.org/wiki/Bates_distribution).\n *\n * @param {number} [n=1] - Number of uniform samples to average (n >= 1)\n */\n bates(n?: number): IDist<number> {\n return bates(this, n)\n }\n\n /**\n * Generates a [Pareto distribution](https://en.wikipedia.org/wiki/Pareto_distribution).\n *\n * @param {number} [alpha=1] - Alpha\n */\n pareto(alpha?: number): IDist<number> {\n return pareto(this, alpha)\n }\n\n /**\n * Generates a [Weibull distribution](https://en.wikipedia.org/wiki/Weibull_distribution).\n *\n * @param {number} [lambda] - Lambda, the scale parameter\n * @param {number} [k] - k, the shape parameter\n */\n weibull(lambda: number, k: number) {\n return weibull(this, lambda, k)\n }\n\n // --------------------------------------------------------------------------\n // Internal\n // --------------------------------------------------------------------------\n\n /**\n * Memoizes distributions to ensure they're only created when necessary.\n *\n * Returns a thunk which that returns independent, identically distributed\n * samples from the specified distribution.\n *\n * @internal\n *\n * @param {string} label - Name of distribution\n * @param {function} getter - Function which generates a new distribution\n * @param {...*} args - Distribution-specific arguments\n */\n protected _memoize<T>(\n label: string,\n getter: IDistFn<any>,\n ...args: any[]\n ): IDist<T> {\n // return getter(this, ...args)\n const key = `${args.join(';')}`\n let value = this._cache[label]\n\n if (value === undefined || value.key !== key) {\n value = {\n key,\n distribution: getter(this, ...args)\n }\n this._cache[label] = value\n }\n\n return value.distribution\n }\n}\n\nexport default new Random()\n"],"mappings":"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","names":["i","irwinHall","normal"]}