UNPKG

2.69 kBJavaScriptView Raw
1import { factory } from '../../utils/factory'
2import { randomMatrix } from './util/randomMatrix'
3import { createRng } from './util/seededRNG'
4import { isMatrix } from '../../utils/is'
5
6const name = 'randomInt'
7const dependencies = ['typed', 'config', '?on']
8
9export const createRandomInt = /* #__PURE__ */ factory(name, dependencies, ({ typed, config, on }) => {
10 // seeded pseudo random number generator
11 let rng = createRng(config.randomSeed)
12
13 if (on) {
14 on('config', function (curr, prev) {
15 if (curr.randomSeed !== prev.randomSeed) {
16 rng = createRng(curr.randomSeed)
17 }
18 })
19 }
20
21 /**
22 * Return a random integer number larger or equal to `min` and smaller than `max`
23 * using a uniform distribution.
24 *
25 * Syntax:
26 *
27 * math.randomInt() // generate a random integer between 0 and 1
28 * math.randomInt(max) // generate a random integer between 0 and max
29 * math.randomInt(min, max) // generate a random integer between min and max
30 * math.randomInt(size) // generate a matrix with random integer between 0 and 1
31 * math.randomInt(size, max) // generate a matrix with random integer between 0 and max
32 * math.randomInt(size, min, max) // generate a matrix with random integer between min and max
33 *
34 * Examples:
35 *
36 * math.randomInt(100) // returns a random integer between 0 and 100
37 * math.randomInt(30, 40) // returns a random integer between 30 and 40
38 * math.randomInt([2, 3]) // returns a 2x3 matrix with random integers between 0 and 1
39 *
40 * See also:
41 *
42 * random, pickRandom
43 *
44 * @param {Array | Matrix} [size] If provided, an array or matrix with given
45 * size and filled with random values is returned
46 * @param {number} [min] Minimum boundary for the random value, included
47 * @param {number} [max] Maximum boundary for the random value, excluded
48 * @return {number | Array | Matrix} A random integer value
49 */
50 return typed(name, {
51 '': () => _randomInt(0, 1),
52 number: (max) => _randomInt(0, max),
53 'number, number': (min, max) => _randomInt(min, max),
54 'Array | Matrix': (size) => _randomIntMatrix(size, 0, 1),
55 'Array | Matrix, number': (size, max) => _randomIntMatrix(size, 0, max),
56 'Array | Matrix, number, number': (size, min, max) => _randomIntMatrix(size, min, max)
57 })
58
59 function _randomIntMatrix (size, min, max) {
60 const res = randomMatrix(size.valueOf(), () => _randomInt(min, max))
61 return isMatrix(size) ? size.create(res) : res
62 }
63
64 function _randomInt (min, max) {
65 return Math.floor(min + rng() * (max - min))
66 }
67})