mirror of
https://github.com/josdejong/mathjs.git
synced 2025-12-08 19:46:04 +00:00
43 lines
1.4 KiB
JavaScript
43 lines
1.4 KiB
JavaScript
'use strict';
|
|
|
|
var seedrandom = require('seed-random');
|
|
|
|
// create a random seed here to prevent an infinite loop from seed-random
|
|
// inside the factory. Reason is that math.random is defined as a getter/setter
|
|
// and seed-random generates a seed from the local entropy by reading every
|
|
// defined object including `math` itself. That means that whilst getting
|
|
// math.random, it tries to get math.random, etc... an infinite loop.
|
|
// See https://github.com/ForbesLindesay/seed-random/issues/6
|
|
var singletonRandom = seedrandom();
|
|
|
|
function factory (type, config, load, typed, math) {
|
|
var random;
|
|
|
|
// create a new random generator with given seed
|
|
function setSeed (seed) {
|
|
random = seed === null ? singletonRandom : seedrandom(String(seed));
|
|
}
|
|
|
|
// initialize a seeded pseudo random number generator with config's random seed
|
|
setSeed(config.randomSeed)
|
|
|
|
// wrapper function so the rng can be updated via generator
|
|
function rng() {
|
|
return random();
|
|
}
|
|
|
|
// updates generator with a new instance of a seeded pseudo random number generator
|
|
math.on('config', function (curr, prev, changes) {
|
|
// if the user specified a randomSeed
|
|
if(changes.randomSeed !== undefined) {
|
|
// update generator with a new instance of a seeded pseudo random number generator
|
|
setSeed(curr.randomSeed)
|
|
}
|
|
});
|
|
|
|
return rng;
|
|
}
|
|
|
|
exports.factory = factory;
|
|
exports.math = true;
|