esnext.math.seeded-prng.js 1.5 KB

12345678910111213141516171819202122232425262728293031323334
  1. var $ = require('../internals/export');
  2. var anObject = require('../internals/an-object');
  3. var numberIsFinite = require('../internals/number-is-finite');
  4. var createIteratorConstructor = require('../internals/iterator-create-constructor');
  5. var InternalStateModule = require('../internals/internal-state');
  6. var SEEDED_RANDOM = 'Seeded Random';
  7. var SEEDED_RANDOM_GENERATOR = SEEDED_RANDOM + ' Generator';
  8. var SEED_TYPE_ERROR = 'Math.seededPRNG() argument should have a "seed" field with a finite value.';
  9. var setInternalState = InternalStateModule.set;
  10. var getInternalState = InternalStateModule.getterFor(SEEDED_RANDOM_GENERATOR);
  11. var $TypeError = TypeError;
  12. var $SeededRandomGenerator = createIteratorConstructor(function SeededRandomGenerator(seed) {
  13. setInternalState(this, {
  14. type: SEEDED_RANDOM_GENERATOR,
  15. seed: seed % 2147483647
  16. });
  17. }, SEEDED_RANDOM, function next() {
  18. var state = getInternalState(this);
  19. var seed = state.seed = (state.seed * 1103515245 + 12345) % 2147483647;
  20. return { value: (seed & 1073741823) / 1073741823, done: false };
  21. });
  22. // `Math.seededPRNG` method
  23. // https://github.com/tc39/proposal-seeded-random
  24. // based on https://github.com/tc39/proposal-seeded-random/blob/78b8258835b57fc2100d076151ab506bc3202ae6/demo.html
  25. $({ target: 'Math', stat: true, forced: true }, {
  26. seededPRNG: function seededPRNG(it) {
  27. var seed = anObject(it).seed;
  28. if (!numberIsFinite(seed)) throw $TypeError(SEED_TYPE_ERROR);
  29. return new $SeededRandomGenerator(seed);
  30. }
  31. });