simple-squiggle

A restricted subset of Squiggle
Log | Files | Refs | README

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;