aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorChris Chambers <[email protected]>2017-06-17 13:52:09 -0500
committerMarak <[email protected]>2017-09-08 16:21:00 -0400
commit8a33cf0e7a57f8fe766034706d0230802788d1ff (patch)
tree44c57f37cc3fe93ce8da113d565abe634e9536d8 /lib
parent2ea9730a4a36af6db2333c8655ab9d4dcc6bc2d4 (diff)
downloadfaker-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.js18
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);