UNPKG

xethya-random-bbs

Version:

An implementation of the Blum Blum Shub PRNG.

127 lines (105 loc) 3.03 kB
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