diff options
| author | Marak <[email protected]> | 2015-07-21 01:03:08 -0700 |
|---|---|---|
| committer | Marak <[email protected]> | 2015-07-21 01:03:08 -0700 |
| commit | 98bb87a82c95c9a982905983166fc9fdaff1d6a4 (patch) | |
| tree | b61bf88e1129c66a512138ff4e02b42d8086a4c0 | |
| parent | 35da03d4e7e6f535471ee471afb1d98f9c075f8d (diff) | |
| parent | 76e3fa5949412ea475de6bba55d6c1194f84540c (diff) | |
| download | faker-98bb87a82c95c9a982905983166fc9fdaff1d6a4.tar.xz faker-98bb87a82c95c9a982905983166fc9fdaff1d6a4.zip | |
Merge pull request #243 from Aweary/random-seed
[api] Implement faker.seed for deterministic output
| -rw-r--r-- | lib/index.js | 25 | ||||
| -rw-r--r-- | lib/random.js | 14 | ||||
| -rw-r--r-- | test/random.unit.js | 8 | ||||
| -rw-r--r-- | vendor/mersenne.js | 5 |
4 files changed, 34 insertions, 18 deletions
diff --git a/lib/index.js b/lib/index.js index 2ebd6028..5f179ae1 100644 --- a/lib/index.js +++ b/lib/index.js @@ -18,7 +18,7 @@ */ function Faker (opts) { - + var self = this; opts = opts || {}; @@ -27,20 +27,19 @@ function Faker (opts) { var locales = self.locales || opts.locales || {}; var locale = self.locale || opts.locale || "en"; var localeFallback = self.localeFallback || opts.localeFallback || "en"; - + self.locales = locales; self.locale = locale; self.localeFallback = localeFallback; - - + self.definitions = {}; - + var Fake = require('./fake'); self.fake = new Fake(self).fake; - + var Random = require('./random'); self.random = new Random(self); - // self.random = require('./random'); + // self.random = require('./random'); var Helpers = require('./helpers'); self.helpers = new Helpers(self); @@ -80,7 +79,7 @@ function Faker (opts) { self.commerce = new Commerce(self); // TODO: fix self.commerce = require('./commerce'); - + var _definitions = { "name": ["first_name", "last_name", "prefix", "suffix", "title", "male_first_name", "female_first_name", "male_middle_name", "female_middle_name", "male_last_name", "female_last_name"], "address": ["city_prefix", "city_suffix", "street_suffix", "county", "country", "country_code", "state", "state_abbr", "street_prefix", "postcode"], @@ -123,8 +122,12 @@ function Faker (opts) { }); }); }); - - + }; -module['exports'] = Faker;
\ No newline at end of file +Faker.prototype.seed = function(value) { + var Random = require('./random'); + this.seedValue = value; + this.random = new Random(this, this.seedValue); +} +module['exports'] = Faker; diff --git a/lib/random.js b/lib/random.js index 2d37c551..fc7e54d9 100644 --- a/lib/random.js +++ b/lib/random.js @@ -1,7 +1,15 @@ var mersenne = require('../vendor/mersenne'); -function Random (faker) { - +function Random (faker, seed) { + // Use a user provided seed if it exists + if (seed) { + if (Array.isArray(seed) && seed.length) { + mersenne.seed_array(seed); + } + else { + mersenne.seed(seed); + } + } // returns a single random number based on a max number or range this.number = function (options) { @@ -28,7 +36,7 @@ function Random (faker) { var max = options.max; if (max >= 0) { max += options.precision; - } + } var randomNumber = options.precision * Math.floor( mersenne.rand(max / options.precision, options.min / options.precision)); diff --git a/test/random.unit.js b/test/random.unit.js index 201c2267..8f047ee5 100644 --- a/test/random.unit.js +++ b/test/random.unit.js @@ -65,10 +65,16 @@ describe("random.js", function () { }; faker.random.number(opts); - + assert.equal(opts.min, min); assert.equal(opts.max, max); }); + + it('should return deterministic results when seeded', function() { + faker.seed(100); + var name = faker.name.findName(); + assert.equal(name, 'Dulce Jenkins'); + }) }); describe('arrayElement', function() { diff --git a/vendor/mersenne.js b/vendor/mersenne.js index 13c49639..33b08e2d 100644 --- a/vendor/mersenne.js +++ b/vendor/mersenne.js @@ -103,7 +103,7 @@ function MersenneTwister19937() //c//mt[0]= s & 0xffffffff; mt[0]= unsigned32(s & 0xffffffff); for (mti=1; mti<N; mti++) { - mt[mti] = + mt[mti] = //c//(1812433253 * (mt[mti-1] ^ (mt[mti-1] >> 30)) + mti); addition32(multiplication32(1812433253, unsigned32(mt[mti-1] ^ (mt[mti-1] >>> 30))), mti); /* See Knuth TAOCP Vol2. 3rd Ed. P.106 for multiplier. */ @@ -133,7 +133,7 @@ function MersenneTwister19937() //c//mt[i] = (mt[i] ^ ((mt[i-1] ^ (mt[i-1] >> 30)) * 1664525)) //c// + init_key[j] + j; /* non linear */ mt[i] = addition32(addition32(unsigned32(mt[i] ^ multiplication32(unsigned32(mt[i-1] ^ (mt[i-1] >>> 30)), 1664525)), init_key[j]), j); - mt[i] = + mt[i] = //c//mt[i] &= 0xffffffff; /* for WORDSIZE > 32 machines */ unsigned32(mt[i] & 0xffffffff); i++; j++; @@ -284,4 +284,3 @@ exports.seed_array = function(A) { } gen.init_by_array(A); } - |
