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