#random #park #miller #carta

bin+lib park-miller-carta-prng

高效的伪随机数生成器

3 个版本

使用旧的 Rust 2015

0.1.3 2018年2月6日
0.1.1 2018年2月2日
0.1.0 2018年2月1日

#10 in #park

MIT 许可证

100KB
971

Park-Miller-Carta PRNG

(文档正在制作中) 这是一个多语言仓库,展示了 C-Rust-Node.js-Web 之间的互操作性和可移植性。

它使用 Rust 作为构建系统,以编译 Robin Whittle 的原始 C 实现。还包括一个忠实的 Rust 端口,可以通过 Emscripten 跨编译到 asm.js 和 WebAssembly,以用于 Node.js 和浏览器。

从浏览器使用

使用 npm i --save --only=production park-miller-carta-prng 安装。

index.html

<!DOCTYPE html>
<html>
<head>
  <title>Wasm</title>
</head>
<body>

<script type="text/javascript">
  var Module = {};

  var prng = {
    seed: (i) => Module.prng_new(i),
    destroy: (ptr) => Module.prng_destroy(ptr),
    getInteger: (ptr) => Module.next_unsigned_integer(ptr),
    getFloat: (ptr) => Module.next_unsigned_float(ptr)
  };

  function fetchAndInstantiate(url, importObject) {
    return fetch(url).then(response =>
      response.arrayBuffer()
    ).then(bytes =>
      WebAssembly.instantiate(bytes, importObject)
    ).then(results =>
      results.instance
    );
  }

  fetchAndInstantiate('node_modules/park-miller-carta-prng/dist/wasm/browser-standalone.wasm', {})
  .then( mod => {
    Module.prng_new = mod.exports.prng_new;
    Module.prng_destroy = mod.exports.prng_destroy;
    Module.next_unsigned_integer = mod.exports.next_unsigned_integer;
    Module.next_unsigned_float = mod.exports.next_unsigned_float;
  })
  .then( () => {
    var ptr = prng.seed(1);
    var container = document.createElement('div');
    container.textContent = `integer: ${prng.getInteger(ptr)} float: ${prng.getFloat(ptr)}`
    document.body.appendChild(container);
    prng.destroy(ptr);
  });

</script>
</body>
</html>

使用您首选的方法通过 python2 -m SimpleHTTPServer/python3 -m http.server 主机 html。

从 Node.js 使用

WebAssembly & asm.js

使用 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();

当您完成对生成器的使用时,应始终调用 destroy()。可用方法

  • prng,接受由 emcc 生成的 asmjswasm 模块。然后,必须提供一个正整数种子。
  • getIntegergetFloatdestroy 方法,解释自明。

本地插件

克隆仓库并 npm run build:addon。检查 src/test.coffee 了解用法。[待办事项] 简单 API,条件构建在 npm 下载时。

从 Rust 使用

park-miller-carta-prng 添加到 [dependencies] 中的 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);
}

入门

  1. 克隆仓库: git clone https://github.com/kenOfYugen/park-miller-carta-prng
  2. 进入目录: cd park-miller-carta-prng
  3. 构建(添加 --release 标志以进行优化构建)
  • Rust-C 静态/动态库: cargo b
  • asm.js 库: cargo b --target asmjs-unknown-emscripten
  • wasm 库: cargo b --target wasm32-unknown-emscripten
  • 独立的 wasm 库: cargo b --target wasm32-unknown-unknown
  • Node.js: npm i && npm run build:all

先决条件

  • Rust, 通过 rustup 获取。
  • Node.js 用于运行 asm.js/wasm。
  • emsdk,用于将代码编译为 asm.js/wasm。

清单

  • Rust API
  • C API
  • Node.js asm.js/wasm 通过 emscripten
  • Node.js 原生插件
  • 浏览器 asm.js/wasm 通过 emscripten
  • 通过 --target wasm32-unknown-unknown 编译 wasm

无运行时依赖