aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarak <[email protected]>2015-07-21 01:03:08 -0700
committerMarak <[email protected]>2015-07-21 01:03:08 -0700
commit98bb87a82c95c9a982905983166fc9fdaff1d6a4 (patch)
treeb61bf88e1129c66a512138ff4e02b42d8086a4c0
parent35da03d4e7e6f535471ee471afb1d98f9c075f8d (diff)
parent76e3fa5949412ea475de6bba55d6c1194f84540c (diff)
downloadfaker-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.js25
-rw-r--r--lib/random.js14
-rw-r--r--test/random.unit.js8
-rw-r--r--vendor/mersenne.js5
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);
}
-