Giter VIP home page Giter VIP logo

jsrand's Introduction

jsrand a.k.a. seeded-rand

Build Status Build Size NPM Downloads NPM

A seeded pseudo-random number generator for JavaScript.

It can be used as either a plain script or as a Node.js module.

Numbers are generated using a one-seeded version of the multiply-with-carry method by George Marsaglia. While this method is okay for most applications, it is not cryptographically strong.

jsrand supports saving and restoring the generator state and common operations on arrays: choice (pick a random element), choices (pick elements at random), sample (pick elements at random without repetition) and shuffle.

See changelog here.

Table of contents

Install

NPM

$ npm install seeded-rand

Plain script

Just download dist/jsrand.min.js and (optionally) dist/jsrand.min.js.map and include it in your app.

Usage

Plain script NPM
<script src="jsrand.min.js"></script>

This will define a global Srand object. If the name Srand is already taken, see noConflict.

const Srand = require('seeded-rand');

or

import Srand from 'seeded-rand';

All methods can be used either statically:

Srand.seed(10); // 10
Srand.random(); // 0.4569510892033577

or instantiating a new generator:

const rnd = new Srand(10);
rnd.random(); // 0.4569510892033577

const othr = new Srand(rnd.seed());
othr.random(); // 0.4569510892033577

Examples

const rnd = new Srand(); // Initiate with random seed

rnd.seed(); // 1836504610 Read the seed
rnd.randomize(); // 3409024789 Random seed is set and returned
rnd.seed(1836504610); // 1836504610 Set a seed

rnd.inRange(0, 10); // 6.866552880965173
rnd.intInRange(0, 10); // 1

rnd.choice([1, 2, 3]); // 3
rnd.choices([1, 2, 3], 3); // [3, 3, 1] possible repetitions
rnd.choices([1, 2, 3], 3); // [2, 2, 3] possible repetitions

rnd.sample([1, 2, 3], 2); // [1, 2] no repetitions
rnd.sample([1, 2, 3], 2); // [1, 2] no repetitions

const state = rnd.getState();
rnd.intInRange(1, 50); // 39
rnd.intInRange(1, 50); // 24
rnd.intInRange(1, 50); // 18

rnd.setState(state); // Resumes previous state, regenerating same random sequence
rnd.intInRange(1, 50); // 39
rnd.intInRange(1, 50); // 24
rnd.intInRange(1, 50); // 18

The same sequence of operations can be repeated with equal results using the static methods of Srand:

Srand.seed(1836504610); // 1836504610 Set the seed 

Srand.inRange(0, 10); // 6.866552880965173
Srand.intInRange(0, 10); // 1

Srand.choice([1, 2, 3]); // 3
Srand.choices([1, 2, 3], 3); // [3, 3, 1] possible repetitions
Srand.choices([1, 2, 3], 3); // [2, 2, 3] possible repetitions

Srand.sample([1, 2, 3], 2); // [1, 2] no repetitions
Srand.sample([1, 2, 3], 2); // [1, 2] no repetitions

const state = Srand.getState();
Srand.intInRange(1, 50); // 39
Srand.intInRange(1, 50); // 24
Srand.intInRange(1, 50); // 18

Srand.setState(state); // Resumes previous state, regenerating same random sequence
Srand.intInRange(1, 50); // 39
Srand.intInRange(1, 50); // 24
Srand.intInRange(1, 50); // 18

API

Method Doc
choice(arr: Array<T>): T

Returns a random element from arr.

If arr is empty, an exception is thrown.

choices(arr: Array<T>, k: number): Array<T>

Returns a k-sized array sampled with replacement from arr, i.e. each element can be sampled more than once.

If k > 0 and arr is empty, throws an exception.

For an alternative without replacement, see sample.

getState(): State
Returns an object with the state of the generator.

Use setState to resume the state.

inRange(a: number, b: number): number

Returns a pseudo-random float number between a inclusive and b exclusive.

intInRange(min: number, max: number): number

Returns a psuedo-random integer between min and max inclusive.

noConflict(): Srand

Only available when using Srand as a plain script.

In the uncommon case the name Srand is already taken, restores its initial value and return the Srand object.

Srand = "my value";

// .. jsrand is loaded ...

const mySrand = Srand.noConflict();
Srand; // "my value"
random(): number

Returns a pseudo-random float number between 0 inclusive and 1 exclusive.

The algorithm used is a one-seeded version of the multiply-with-carry method by George Marsaglia.

randomize(): number
Sets and returns a random seed.
sample(arr: Array<T>, k: number): Array<T>

Returns a k-sized array sampled without replacement from arr.

If k > arr.length, an exception is thrown.

For an alternative with replacement, see choices.

seed(seed?: number): number
Sets or gets (if no argument is given) the seed.

The seed can be any float or integer number.

setState(state: State): void

Resume a state previously returned by getState.

shuffle(arr: Array<T>): Array<T>

Shuffles arr in-place using the Fisher-Yates algorithm and returns it (arr is modified).

License

Copyright © 2014-2020, Domenico De Felice.

Provided under the terms of the MIT License.

jsrand's People

Contributors

dependabot[bot] avatar domenicodefelice avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar

jsrand's Issues

Not very random

#!/usr/bin/env node
import Srand from 'seeded-rand';

let seed = 0;
let last;

while (true) {
  const next = new Srand(seed++).intInRange(1, 20);

  console.log(seed, next);

  if (last && last !== next) {
    break;
  }

  last = next;
}
1 10
2 10
3 10
[..]
10264 10
10265 10
10266 10
10267 10
10268 10
10269 10
10270 10
10271 10
10272 10
10273 10
10274 10
10275 10
10276 10
10277 10
10278 10
10279 10
10280 10
10281 10
10282 10
10283 11

Increasing the randomness of results

Hi, I'm currently using Unix timestamps as seeds and I have noticed that the random numbers it returns increase as my seed increases. Is there a way to make this seem more random?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.