xethya-random-bbs
Version:
An implementation of the Blum Blum Shub PRNG.
155 lines (123 loc) • 3.75 kB
HTML
<html lang="en">
<head>
<meta charset="utf-8">
<title>JSDoc: Source: BlumBlumShub.js</title>
<script src="scripts/prettify/prettify.js"> </script>
<script src="scripts/prettify/lang-css.js"> </script>
<!--[if lt IE 9]>
<script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script>
<![endif]-->
<link type="text/css" rel="stylesheet" href="styles/prettify-tomorrow.css">
<link type="text/css" rel="stylesheet" href="styles/jsdoc-default.css">
</head>
<body>
<div id="main">
<h1 class="page-title">Source: BlumBlumShub.js</h1>
<section>
<article>
<pre class="prettyprint source linenums"><code>/**
* 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}
*/
const P = 87566873;
/**
* Default constant value for setting up the BBS PRNG.
* Q must be a prime number.
* @type {Number}
*/
const 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>}
*/
const DefaultSeeds = [193945, 740191, 191];
/**
* Instantiates a Blum Blum Shub PRNG.
*/
class BlumBlumShub {
/**
* 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
*/
constructor(settings) {
const defaults = {
p: P,
q: Q,
seedNumber: null,
};
this.settings = Object.assign({}, defaults, settings);
let seedNumber = this.settings.seedNumber;
const { p, q } = this.settings;
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
*/
static recommendsToReinstantiate() {
return false;
}
/**
* Generates a pseudo-random number and updates the seed for a next roll.
* Number is always between 0 and 1.
*
* @return {Number}
*/
generateRandom() {
const 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}
*/
generateRandomInteger() {
return Number(this.generateRandom().toString().replace(/\./, ''));
}
}
export { P, Q, DefaultSeeds, BlumBlumShub };
</code></pre>
</article>
</section>
</div>
<nav>
<h2><a href="index.html">Home</a></h2><h3>Classes</h3><ul><li><a href="BlumBlumShub.html">BlumBlumShub</a></li></ul><h3>Global</h3><ul><li><a href="global.html#DefaultSeeds">DefaultSeeds</a></li><li><a href="global.html#P">P</a></li><li><a href="global.html#Q">Q</a></li></ul>
</nav>
<br class="clear">
<footer>
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.4.1</a> on Sun Sep 18 2016 12:08:21 GMT-0300 (ART)
</footer>
<script> prettyPrint(); </script>
<script src="scripts/linenumber.js"> </script>
</body>
</html>