UNPKG

1.39 kBJavaScriptView Raw
1'use strict'
2
3const 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
11const singletonRandom = seedrandom()
12
13function 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
41exports.factory = factory
42exports.math = true