xethya-random-bbs
Version:
An implementation of the Blum Blum Shub PRNG.
127 lines (105 loc) • 3.03 kB
JavaScript
import _Object$assign from 'babel-runtime/core-js/object/assign';
import _classCallCheck from 'babel-runtime/helpers/classCallCheck';
import _createClass from 'babel-runtime/helpers/createClass';
/**
* xethya-random-bbs
*
* Copyright © 2016 Joel A. Villarreal Bertoldi. All rights reserved.
*
* This source code is licensed under the MIT license found in the
* LICENSE.txt file in the root directory of this source tree.
*/
/**
* Default constant value for setting up the BBS PRNG.
* P must be a prime number.
* @type {Number}
*/
var P = 87566873;
/**
* Default constant value for setting up the BBS PRNG.
* Q must be a prime number.
* @type {Number}
*/
var Q = 5631179;
/**
* A list of default seed values, tested to be evenly distributed.
* @see http://wiki.fib.upc.es/sim/index.php/Blum_Blum_Shub#Tests
* @type {Array.<Number>}
*/
var DefaultSeeds = [193945, 740191, 191];
/**
* Instantiates a Blum Blum Shub PRNG.
*/
var BlumBlumShub = function () {
/**
* Initializes the generator.
*
* @param {Number} p A prime value (defaults to P).
* @param {Number} q A prime value (defaults to Q).
* @param {Number} seedNumber A seed number to feed the generator (defaults to any value
* in DefaultSeeds).
* @constructor
*/
function BlumBlumShub(settings) {
_classCallCheck(this, BlumBlumShub);
var defaults = {
p: P,
q: Q,
seedNumber: null
};
this.settings = _Object$assign({}, defaults, settings);
var seedNumber = this.settings.seedNumber;
var _settings = this.settings;
var p = _settings.p;
var q = _settings.q;
if (seedNumber) {
seedNumber = Math.abs(seedNumber);
} else {
seedNumber = DefaultSeeds[Math.floor(Math.random() * DefaultSeeds.length)];
}
this.seedNumber = seedNumber;
this.randomIndex = seedNumber;
this.M = p * q;
this.P = p;
this.Q = q;
}
/**
* Determines if the generator works better by being reinstantiated after
* every generated number.
*
* @return {Boolean}
* @static
*/
_createClass(BlumBlumShub, [{
key: 'generateRandom',
/**
* Generates a pseudo-random number and updates the seed for a next roll.
* Number is always between 0 and 1.
*
* @return {Number}
*/
value: function generateRandom() {
var r = this.randomIndex * this.randomIndex % this.M;
this.randomIndex = r;
return Math.abs(r / this.M);
}
/**
* Same as `generateRandom()`, but converts the number to an Integer.
*
* @return {Number}
*/
}, {
key: 'generateRandomInteger',
value: function generateRandomInteger() {
return Number(this.generateRandom().toString().replace(/\./, ''));
}
}], [{
key: 'recommendsToReinstantiate',
value: function recommendsToReinstantiate() {
return false;
}
}]);
return BlumBlumShub;
}();
export { P, Q, DefaultSeeds, BlumBlumShub };
//# sourceMappingURL=index.es6.js.map