random.js (3527B)
1 import { factory } from '../../utils/factory.js'; 2 import { isMatrix } from '../../utils/is.js'; 3 import { createRng } from './util/seededRNG.js'; 4 import { randomMatrix } from './util/randomMatrix.js'; 5 var name = 'random'; 6 var dependencies = ['typed', 'config', '?on']; 7 export var createRandom = /* #__PURE__ */factory(name, dependencies, _ref => { 8 var { 9 typed, 10 config, 11 on 12 } = _ref; 13 // seeded pseudo random number generator 14 var rng = createRng(config.randomSeed); 15 16 if (on) { 17 on('config', function (curr, prev) { 18 if (curr.randomSeed !== prev.randomSeed) { 19 rng = createRng(curr.randomSeed); 20 } 21 }); 22 } 23 /** 24 * Return a random number larger or equal to `min` and smaller than `max` 25 * using a uniform distribution. 26 * 27 * Syntax: 28 * 29 * math.random() // generate a random number between 0 and 1 30 * math.random(max) // generate a random number between 0 and max 31 * math.random(min, max) // generate a random number between min and max 32 * math.random(size) // generate a matrix with random numbers between 0 and 1 33 * math.random(size, max) // generate a matrix with random numbers between 0 and max 34 * math.random(size, min, max) // generate a matrix with random numbers between min and max 35 * 36 * Examples: 37 * 38 * math.random() // returns a random number between 0 and 1 39 * math.random(100) // returns a random number between 0 and 100 40 * math.random(30, 40) // returns a random number between 30 and 40 41 * math.random([2, 3]) // returns a 2x3 matrix with random numbers between 0 and 1 42 * 43 * See also: 44 * 45 * randomInt, pickRandom 46 * 47 * @param {Array | Matrix} [size] If provided, an array or matrix with given 48 * size and filled with random values is returned 49 * @param {number} [min] Minimum boundary for the random value, included 50 * @param {number} [max] Maximum boundary for the random value, excluded 51 * @return {number | Array | Matrix} A random number 52 */ 53 54 55 return typed(name, { 56 '': () => _random(0, 1), 57 number: max => _random(0, max), 58 'number, number': (min, max) => _random(min, max), 59 'Array | Matrix': size => _randomMatrix(size, 0, 1), 60 'Array | Matrix, number': (size, max) => _randomMatrix(size, 0, max), 61 'Array | Matrix, number, number': (size, min, max) => _randomMatrix(size, min, max) 62 }); 63 64 function _randomMatrix(size, min, max) { 65 var res = randomMatrix(size.valueOf(), () => _random(min, max)); 66 return isMatrix(size) ? size.create(res) : res; 67 } 68 69 function _random(min, max) { 70 return min + rng() * (max - min); 71 } 72 }); // number only implementation of random, no matrix support 73 // TODO: there is quite some duplicate code in both createRandom and createRandomNumber, can we improve that? 74 75 export var createRandomNumber = /* #__PURE__ */factory(name, ['typed', 'config', '?on'], _ref2 => { 76 var { 77 typed, 78 config, 79 on, 80 matrix 81 } = _ref2; 82 // seeded pseudo random number generator1 83 var rng = createRng(config.randomSeed); 84 85 if (on) { 86 on('config', function (curr, prev) { 87 if (curr.randomSeed !== prev.randomSeed) { 88 rng = createRng(curr.randomSeed); 89 } 90 }); 91 } 92 93 return typed(name, { 94 '': () => _random(0, 1), 95 number: max => _random(0, max), 96 'number, number': (min, max) => _random(min, max) 97 }); 98 99 function _random(min, max) { 100 return min + rng() * (max - min); 101 } 102 });