From 8a33cf0e7a57f8fe766034706d0230802788d1ff Mon Sep 17 00:00:00 2001 From: Chris Chambers Date: Sat, 17 Jun 2017 13:52:09 -0500 Subject: 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. --- lib/random.js | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) (limited to 'lib') 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); -- cgit v1.2.3