random.js 4.2 KB

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