高等前端进阶
本日给大家带来的主题是前真个一个随机数开源库,即 Aimless.js,相信大家在日常事情中都有机会利用它。话不多说,直接开始!
在大型游戏引擎和框架之外,很少支持在 JavaScript 中天生随机数。 当然,原生 Math.random 函数有很多替代品,但如果想天生一个指定例模内的随机数怎么办?特殊是,如果想天生的结果不是 0 到 1 之间的数字怎么办?

在这种情形下,Aimless.js 出身了,它补全了 JS 在随机数方面的空缺,而且体积很小 (< 6kB)、相对独立、无任何外部依赖,并供应各种有用的随机数实用程序。 比如:用于天生随机数、从数组中选取随机元素、获取指定例模内的随机数等等。 最主要的是,Aimless.js 可以与开拓者最喜好的 PRNG(伪随机数天生器)集成,为运用程序供应额外的随机层。
值得把稳的是,Aimless.js 依赖于 ES5 数组方法,并在所有当代浏览器中得到支持,但是 Aimless.js 未操持支持旧版或已弃用的浏览器。
2.利用 Aimless.js根本利用首先须要安装 Aimless.js 并将其添加到 package.json 依赖项中。
$ npm install aimless.js --save
然后将函数导入到将利用它们的文件中。
import { bool, intRange } from "aimless.js";
利用自定义 PRNG
Aimless.js 与任何返回数字 num >= 0 和 num < 1 的自定义 PRNG 兼容,每个函数都接管一个要利用的 engine。
import { bool } from "aimless.js";const engine = () => 0;bool(engine); // false
此外,Aimless 中的每个函数都有一个名为 withEngine 的对应函数。这个函数将返回它的对应部分,并在引擎周围有一个闭包,以是开拓者不须要每次都通报它。
import { boolWithEngine } from "aimless.js";const engine = () => 0;const bool = boolWithEngine(engine);bool(); // false
如果没有供应自定义引擎,每个函数都将默认利用供应的 defaultEngine。默认引擎在宿主环境支持时利用 crypto.getrandomvalues 方法,并在环境不支持时候回退到 Math.random 方法。
3.Aimless.js 常见 API 先容bool(engine)返回 true 或 false。
char(string, engine)从供应的字符串中返回一个随机字符。
const randomChar = char("the missing JS randomness library");// 可能返回 's', ' ', 'l', etc
customDist(function, engine)
按照选择的自定义分布返回一个随机数,函数应接管 0 到 1 之间的数字。
const randomOfCustomDist = customDist((randomNumber) => randomNumber / 2);
exponentialDist(lambda, engine)
利用供应的 lambda 返回一个服从指数分布的随机数。
const samples = [];const lambda = 0.5;for (let i = 0; i < 100000; i++) { const randomValue = exponentialDist(lambda); samples.push(randomValue);}// 可以预期 `samples` 的均匀值为 (1 / lambda) +/- 0.01,// 天生更多样本将确保 (1 / lambda) 的均值
floatRange(min, max, engine)
返回 min 和 max 之间的随机浮点数。
const randomFloat = floatRange(0.1, 0.2);
intRange(min, max, engine)
返回 min 和 max 之间的随机整数。
const randomInteger = intRange(5, 10);
intSequence(min, max, engine)
以随机顺序返回一个数组,个中包含 min 和 max 之间的所有整数。
const intSeq = intSequence(-1, 3);// 返回 [3,-1,2,1,0], [0,2,-1,3,1], etc
normalDist(mean, stdDev, engine)
返回一个服从均值 mean 和标准差 stdDev 的正态分布的随机数。
const samples = [];for (let i = 0; i < 100000; i++) { const randomValue = normalDist(0, 1); samples.push(randomValue);}// 可以期望 `samples` 的均匀值为 0 +/- 0.01,// 天生更多样本将确保均匀值为 0
oneOf(array, engine)
从供应的数组中返回一个随机项。
const randomItem = oneOf([1, 2, 3]);const randomObj = oneOf([{ a: 1 }, { b: 2 }, { c: 3 }]);
seedFunc(seed)
返回一个种子随机数天生器,种子 RNG 产生随机数,但如果利用相同的种子,则结果可以预测。把稳:Park-Miller PRNG 用于供应种子功能,因此不接管 engine。
const seededFunction = seedFunc(1);seededFunction(); // 0.000007825903601782307seededFunction(); // 0.13153778773875702seededFunction(); // 0.7556053220812281const newSeeded = seedFunc(1);newSeeded(); // 0.000007825903601782307newSeeded(); // 0.13153778773875702newSeeded(); // 0.7556053220812281
sequence(array, engine)
返回一个新数组,个中包含数组中包含的相同项目,但顺序是随机的。
const randomSeq = sequence([1, 2, 3]);// 可能返回 [3,1,2], [2,3,1], etc.
uniqFuncIntRange(min, max, engine)
利用供应的引擎返回 min 和 max 之间的唯一随机数。如果没有通报 engine,将利用 defaultEngine,如果没有剩余的唯一值可返回,则返回 null。
const uniqueRNG = uniqFuncIntRange(1, 3);uniqueRNG(); // 2uniqueRNG(); // 3uniqueRNG(); // 1uniqueRNG(); // null
uniqFuncSequence(array, engine)
利用供应的 engine 从供应的数组中返回一个唯一的随机数。如果没有通报 engine 参数,将利用 defaultEngine。如果没有剩余的唯一值可返回,则返回 null。
const uniqueRNG = uniqFuncSequence([10, 20, 30]);uniqueRNG(); // 20uniqueRNG(); // 30uniqueRNG(); // 10uniqueRNG(); // null
uuid(engine)
利用供应的 engine 返回有效的 RFC4122 版本 4 ID 十六进制字符串。
const id = uuid();console.log(id); // ef486db4-7f49-43b3-a1ea-b0e0a22bc944
weighted(numbers, weights, engine)
返回供应的 numbers 之一,倾向于供应的相应权重,数字可以包括浮点数。
const weightedDiceRoll = weighted([1, 2, 3, 4, 5, 6], [1, 1, 1, 1, 1, 10]);// 将比其他选项更频繁地返回 6
4.其他随机数方案
当然,除了 Aimless.js 外,一些其他的开源随机数方案也值得大家重点关注,比如:
seedrandom.js用于 JavaScript 的种子随机数天生器,可用作纯 JS 脚本、Node.js 或 AMD 模块。在Github上通过MIT协议开源,有1.9k的star、项目依赖量达到了 187k。
// 本地 PRNG:不影响 Math.random。var seedrandom = require('seedrandom');var rng = seedrandom('hello.');console.log(rng()); // 返回 0.9282578795792454// 全局 PRNG: set Math.random.seedrandom('hello.', { global: true });console.log(Math.random()); // 始终返回 0.9282578795792454
Chance.js
Chance.js是JavaScript 的随机天生器助手,可以天生随机数、字符、字符串、名称、地址和险些任何其他东西。在 Github 上通过 MIT 协议开源,有 6.2k 的star、项目依赖量达到了 76.1k,代码贡献者100+,是一个非常精良的前端开源项目。
Random.js
即一个数学上精确的 JavaScript 随机数天生器库,灵感紧张来自 C++11 的 <random>。目前在Github上通过MIT协议开源,有0.6k的star、值得长期关注。
// ES6 模块import { Random } from "random-js";const random = new Random(); // uses the nativeMath engineconst value = random.integer(1, 100);
5.本文总结
本文紧张和大家先容下前真个一个非常强大的随机数开源库,即 Aimless.js。相信通过本文的阅读,大家对 Aimless.js 都会有一个初步的理解。
由于篇幅有限,文章并没有过多展开,如果有兴趣,可以在我的主页连续阅读,同时文末的参考资料供应了大量精良文档以供学习。末了,欢迎大家点赞、评论、转发、收藏!
参考资料
https://github.com/ChrisCavs/aimless.js
https://chriscavs.github.io/aimless-demo/
https://www.cssscript.com/random-number-generator-aimless/
https://github.com/davidbau/seedrandom
https://github.com/ckknight/random-js
https://chancejs.com/
https://github.com/chancejs/chancejs
https://dev.to/chriscavs/aimlessjs-the-missing-js-randomness-library-29k3