random.js 3.4 KB

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