| var $ = require('../internals/export'); |
| var anObject = require('../internals/an-object'); |
| var numberIsFinite = require('../internals/number-is-finite'); |
| var createIteratorConstructor = require('../internals/create-iterator-constructor'); |
| var InternalStateModule = require('../internals/internal-state'); |
| |
| var SEEDED_RANDOM = 'Seeded Random'; |
| var SEEDED_RANDOM_GENERATOR = SEEDED_RANDOM + ' Generator'; |
| var setInternalState = InternalStateModule.set; |
| var getInternalState = InternalStateModule.getterFor(SEEDED_RANDOM_GENERATOR); |
| var SEED_TYPE_ERROR = 'Math.seededPRNG() argument should have a "seed" field with a finite value.'; |
| |
| var $SeededRandomGenerator = createIteratorConstructor(function SeededRandomGenerator(seed) { |
| setInternalState(this, { |
| type: SEEDED_RANDOM_GENERATOR, |
| seed: seed % 2147483647 |
| }); |
| }, SEEDED_RANDOM, function next() { |
| var state = getInternalState(this); |
| var seed = state.seed = (state.seed * 1103515245 + 12345) % 2147483647; |
| return { value: (seed & 1073741823) / 1073741823, done: false }; |
| }); |
| |
| // `Math.seededPRNG` method |
| // https://github.com/tc39/proposal-seeded-random |
| // based on https://github.com/tc39/proposal-seeded-random/blob/78b8258835b57fc2100d076151ab506bc3202ae6/demo.html |
| $({ target: 'Math', stat: true, forced: true }, { |
| seededPRNG: function seededPRNG(it) { |
| var seed = anObject(it).seed; |
| if (!numberIsFinite(seed)) throw TypeError(SEED_TYPE_ERROR); |
| return new $SeededRandomGenerator(seed); |
| } |
| }); |