randomInt.js 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. import { factory } from '../../utils/factory.js';
  2. import { randomMatrix } from './util/randomMatrix.js';
  3. import { createRng } from './util/seededRNG.js';
  4. import { isMatrix } from '../../utils/is.js';
  5. var name = 'randomInt';
  6. var dependencies = ['typed', 'config', '?on'];
  7. export var createRandomInt = /* #__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 integer number larger or equal to `min` and smaller than `max`
  24. * using a uniform distribution.
  25. *
  26. * Syntax:
  27. *
  28. * math.randomInt() // generate a random integer between 0 and 1
  29. * math.randomInt(max) // generate a random integer between 0 and max
  30. * math.randomInt(min, max) // generate a random integer between min and max
  31. * math.randomInt(size) // generate a matrix with random integer between 0 and 1
  32. * math.randomInt(size, max) // generate a matrix with random integer between 0 and max
  33. * math.randomInt(size, min, max) // generate a matrix with random integer between min and max
  34. *
  35. * Examples:
  36. *
  37. * math.randomInt(100) // returns a random integer between 0 and 100
  38. * math.randomInt(30, 40) // returns a random integer between 30 and 40
  39. * math.randomInt([2, 3]) // returns a 2x3 matrix with random integers between 0 and 1
  40. *
  41. * See also:
  42. *
  43. * random, pickRandom
  44. *
  45. * @param {Array | Matrix} [size] If provided, an array or matrix with given
  46. * size and filled with random values is returned
  47. * @param {number} [min] Minimum boundary for the random value, included
  48. * @param {number} [max] Maximum boundary for the random value, excluded
  49. * @return {number | Array | Matrix} A random integer value
  50. */
  51. return typed(name, {
  52. '': () => _randomInt(0, 1),
  53. number: max => _randomInt(0, max),
  54. 'number, number': (min, max) => _randomInt(min, max),
  55. 'Array | Matrix': size => _randomIntMatrix(size, 0, 1),
  56. 'Array | Matrix, number': (size, max) => _randomIntMatrix(size, 0, max),
  57. 'Array | Matrix, number, number': (size, min, max) => _randomIntMatrix(size, min, max)
  58. });
  59. function _randomIntMatrix(size, min, max) {
  60. var res = randomMatrix(size.valueOf(), () => _randomInt(min, max));
  61. return isMatrix(size) ? size.create(res) : res;
  62. }
  63. function _randomInt(min, max) {
  64. return Math.floor(min + rng() * (max - min));
  65. }
  66. });