3 个版本
使用旧的 Rust 2015
0.1.3 | 2018年2月6日 |
---|---|
0.1.1 | 2018年2月2日 |
0.1.0 | 2018年2月1日 |
#10 in #park
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
生成的asmjs
或wasm
模块。然后,必须提供一个正整数种子。getInteger
、getFloat
和destroy
方法,解释自明。
本地插件
克隆仓库并 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);
}
入门
- 克隆仓库:
git clone https://github.com/kenOfYugen/park-miller-carta-prng
- 进入目录:
cd park-miller-carta-prng
- 构建(添加
--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 API
- C API
- Node.js asm.js/wasm 通过
emscripten
- Node.js 原生插件
- 浏览器 asm.js/wasm 通过
emscripten
- 通过
--target wasm32-unknown-unknown
编译 wasm