distributed-randomizer

1.0.0 • Public • Published

DistRND.js

NPM version NPM Downloads

DistRND is a small PRNG (pseudorandom number generator) which also evenly distributes the random values over the given range.

■ Install

<script src="DistRND.min.js"></script>

■ Install (NPM)

npm i distributed-randomizer

■ Use

//Add this line when using NPM:
//const DistRND = require('distributed-randomizer');
 
const rand = new DistRND(min, max);
rand.next();

■ Parameters

argument data type description default
min positive int Minimum value
max positive int Maximum value
spread positive int High spread will distribute numbers more randomly 0

Note: next() will behave more and more like Math.random() with increasing high spread value.

Tip: Start with spread = 1 and increase slowly to see the effects.

■ Showcase

Let's assume we want to generate 10.000 random numbers between 1 and 10. We will count the occurrence of each number for demonstrating purposes:

Comparison:

let data1 = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
let data2 = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
for (let i = 0; i < 10000; i++) {
    data1[Math.floor(Math.random() * 10)]++;    //with Math.random()
    data2[rand.next()]++;                       //with DistRND.js
}

Results:

data1 (sorted): [934, 956, 957, 997, 1007, 1016, 1018, 1034, 1039, 1042]
data2 (sorted): [1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000]

As you can see the normal Math.random() function can vary quite a bit from the average due to the nature of randomness or at least pseudorandomness in JavaScript. In this case the deviation from 1000 was ~3% on average and ~6.5% maximum.

■ Speed

DistRND.js can generate 1 Mio. random numbers between 1 and 1000 in less than 100 ms.

■ Implementation

  • Generate random number x from active scope
  • Add 1 to occurrence of x
  • If new occurrence of x is greater than the average: Drop x from active scope
  • If average updates: Reevaluate active scope

■ FAQ

• Is it still random?

Yes. The numbers in the active scope are still chosen at random with Math.random().

• Why manipulate randomness?

Example 1: When you want to train a Neural Network you could use this to train it with random sample data but also ensure that it won't get overtrained.

Example 2: When you have a game with multiple players you could use this to select random players but also ensure that every player gets the same amount of turns over the entire game.

Package Sidebar

Install

npm i distributed-randomizer

Weekly Downloads

0

Version

1.0.0

License

MIT

Unpacked Size

10.1 kB

Total Files

5

Last publish

Collaborators

  • lukas-dachtler