xethya-random-bbs
Version:
An implementation of the Blum Blum Shub PRNG.
140 lines (115 loc) • 4.13 kB
JavaScript
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('babel-runtime/core-js/object/assign'), require('babel-runtime/helpers/classCallCheck'), require('babel-runtime/helpers/createClass')) :
typeof define === 'function' && define.amd ? define(['exports', 'babel-runtime/core-js/object/assign', 'babel-runtime/helpers/classCallCheck', 'babel-runtime/helpers/createClass'], factory) :
(factory((global.xethya-random-bbs = global.xethya-random-bbs || {}),global._Object$assign,global._classCallCheck,global._createClass));
}(this, function (exports,_Object$assign,_classCallCheck,_createClass) { 'use strict';
_Object$assign = 'default' in _Object$assign ? _Object$assign['default'] : _Object$assign;
_classCallCheck = 'default' in _classCallCheck ? _classCallCheck['default'] : _classCallCheck;
_createClass = 'default' in _createClass ? _createClass['default'] : _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;
}();
exports.P = P;
exports.Q = Q;
exports.DefaultSeeds = DefaultSeeds;
exports.BlumBlumShub = BlumBlumShub;
Object.defineProperty(exports, '__esModule', { value: true });
}));
//# sourceMappingURL=index.umd.js.map