UNPKG

xethya-random-bbs

Version:

An implementation of the Blum Blum Shub PRNG.

136 lines (111 loc) 3.34 kB
'use strict'; Object.defineProperty(exports, '__esModule', { value: true }); function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; } var _Object$assign = _interopDefault(require('babel-runtime/core-js/object/assign')); var _classCallCheck = _interopDefault(require('babel-runtime/helpers/classCallCheck')); var _createClass = _interopDefault(require('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; }(); exports.P = P; exports.Q = Q; exports.DefaultSeeds = DefaultSeeds; exports.BlumBlumShub = BlumBlumShub; //# sourceMappingURL=index.js.map