diff options
| author | Chris Chambers <[email protected]> | 2017-06-17 13:52:09 -0500 |
|---|---|---|
| committer | Marak <[email protected]> | 2017-09-08 16:21:00 -0400 |
| commit | 8a33cf0e7a57f8fe766034706d0230802788d1ff (patch) | |
| tree | 44c57f37cc3fe93ce8da113d565abe634e9536d8 /lib | |
| parent | 2ea9730a4a36af6db2333c8655ab9d4dcc6bc2d4 (diff) | |
| download | faker-8a33cf0e7a57f8fe766034706d0230802788d1ff.tar.xz faker-8a33cf0e7a57f8fe766034706d0230802788d1ff.zip | |
Update Random to create a per-instance copy of the RNG
Before this change, it appeared that multiple, independent Faker
instances were legal. But, when multiple instances were created, their
shared random number generators would overwrite each others' states.
After this change, each Random instance (and therefore each Faker
instance) has its own copy of the random number generator, ensuring that
calls to one Faker instance do not affect the stream of values generated
by another.
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/random.js | 18 |
1 files changed, 15 insertions, 3 deletions
diff --git a/lib/random.js b/lib/random.js index 8dccf376..e38b5732 100644 --- a/lib/random.js +++ b/lib/random.js @@ -5,15 +5,27 @@ var mersenne = require('../vendor/mersenne'); * @namespace faker.random */ function Random (faker, seed) { + var gen = new mersenne.MersenneTwister19937(); + // Use a user provided seed if it exists if (seed) { if (Array.isArray(seed) && seed.length) { - mersenne.seed_array(seed); + gen.init_by_array(seed); } else { - mersenne.seed(seed); + gen.init_genrand(seed); } } + + // Copied from the marsenne package for compatibility. + function rand(max, min) { + if (max === undefined) { + min = 0; + max = 32768; + } + return Math.floor(gen.genrand_real2() * (max - min) + min); + } + /** * returns a single random number based on a max number or range * @@ -48,7 +60,7 @@ function Random (faker, seed) { } var randomNumber = Math.floor( - mersenne.rand(max / options.precision, options.min / options.precision)); + rand(max / options.precision, options.min / options.precision)); // Workaround problem in Float point arithmetics for e.g. 6681493 / 0.01 randomNumber = randomNumber / (1 / options.precision); |
