1 |
|
2 |
|
3 | const seedrandom = require('seed-random')
|
4 |
|
5 | // create a random seed here to prevent an infinite loop from seed-random
|
6 | // inside the factory. Reason is that math.random is defined as a getter/setter
|
7 | // and seed-random generates a seed from the local entropy by reading every
|
8 | // defined object including `math` itself. That means that whilst getting
|
9 | // math.random, it tries to get math.random, etc... an infinite loop.
|
10 | // See https://github.com/ForbesLindesay/seed-random/issues/6
|
11 | const singletonRandom = seedrandom()
|
12 |
|
13 | function factory (type, config, load, typed, math) {
|
14 | let random
|
15 |
|
16 | // create a new random generator with given seed
|
17 | function setSeed (seed) {
|
18 | random = seed === null ? singletonRandom : seedrandom(String(seed))
|
19 | }
|
20 |
|
21 | // initialize a seeded pseudo random number generator with config's random seed
|
22 | setSeed(config.randomSeed)
|
23 |
|
24 | // wrapper function so the rng can be updated via generator
|
25 | function rng () {
|
26 | return random()
|
27 | }
|
28 |
|
29 | // updates generator with a new instance of a seeded pseudo random number generator
|
30 | math.on('config', function (curr, prev, changes) {
|
31 | // if the user specified a randomSeed
|
32 | if (changes.randomSeed !== undefined) {
|
33 | // update generator with a new instance of a seeded pseudo random number generator
|
34 | setSeed(curr.randomSeed)
|
35 | }
|
36 | })
|
37 |
|
38 | return rng
|
39 | }
|
40 |
|
41 | exports.factory = factory
|
42 | exports.math = true
|