UNPKG

xethya-random-bbs

Version:

An implementation of the Blum Blum Shub PRNG.

140 lines (115 loc) 4.13 kB
(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