park-miller-carta-prng 0.1.1

An efficient Pseudo-Random Number Generator
Documentation

Park-Miller-Carta PRNG

(documentation in progress) This is a multi-language repository, demonstrating C-Rust-Node.js-Web interoperability/portability.

It utilizes Rust as a build system, in order to compile the original C implemetations by Robin Whittle. A faithful Rust port is also included, cross-compilable to asm.js and WebAssembly via Emscripten, for use in Node.js and browsers.

Using from Node.js

Add with npm i --save --only=production park-miller-carta-prng.

index.js:

let {prng, asmjs, wasm} = require("park-miller-carta-prng");
let assert = require('assert');

// use asm.js version
let generator = prng(asmjs)(1);

assert(generator.getInteger() === 16807);
generator.destroy();

// use wasm version
generator = prng(wasm)(1);

assert(generator.getInteger() === 16807);
generator.destroy();

You should always call destroy() when you are done using the generator. Available methods:

  • prng, takes either the supplied asmjs, or wasm modules, generated by emcc. Then, it must be supplied with a positive seed integer.
  • getInteger, getFloat and destroy methods, are self explanatory.

Using from Rust

Add park-miller-carta-prng to [dependencies] in Cargo.toml

main.rs:

extern crate prng;
use prng::PRNG;

fn main() {
    let mut prng = PRNG::new(1);
    let random_float = prng.next_unsigned_float();
    assert_eq!(0.000007826369, random_float);

    let random_int = prng.next_unsigned_integer();
    assert_eq!(282475249, random_int);
}

Getting Started

  1. Clone the repository: git clone https://github.com/kenOfYugen/park-miller-carta-prng
  2. Enter the directory: cd park-miller-carta-prng
  3. Build (add the --release flag for optimized builds)
  • Rust-C static/dynamic libraries: cargo b
  • asm.js library: cargo b --target asmjs-unknown-emscripten
  • wasm library: cargo b --target wasm32-unknown-emscripter
  • Node.js: npm i && npm run build:all

Prerequisites

  • Rust, get it via rustup.
  • Node.js for running asm.js/wasm.
  • emsdk, for compilation to asm.js/wasm.

Checklist

  • Rust API
  • C API
  • Node.js asm.js/wasm via emscripten
  • Browser asm.js/wasm via emscripten
  • wasm via --target wasm32-unknown-unknown