UNPKG

randomcryp

Version:

A cryptographically secure, feature rich, zero dependency and browser friendly random number generator library.

122 lines (113 loc) 2.88 kB
// src/lib/uSafeInt.ts var POW_2_37 = Math.pow(2, 37); var POW_2_21 = Math.pow(2, 21); var POW_2_5 = Math.pow(2, 5); var uSafeInt = () => { const [num1, num2, num3, num4] = crypto.getRandomValues(new Uint16Array(4)); return num1 * POW_2_37 + num2 * POW_2_21 + num3 * POW_2_5 + (num4 & POW_2_5 - 1); }; // src/lib/bool.ts var bool = () => uSafeInt() % 2 === 0; // src/lib/float.ts var POW_2_53 = Math.pow(2, 53); var float = () => uSafeInt() / POW_2_53; // src/lib/choice.ts var choice = (choices) => { if (choices.length === 0) return; return choices[Math.floor(float() * choices.length)]; }; // src/lib/hex.ts var digits = "0123456789abcdef"; var hex = (length = 8, prefix = false) => { const randArr = crypto.getRandomValues(new Uint8Array(Math.ceil(length / 2))); const hexArr = new Array(randArr.length); for (let i = 0, j = 0;i < length; i++, j = Math.floor(i / 2)) { if (i % 2 === 0) { hexArr[i] = digits[randArr[j] >> 4]; } else { hexArr[i] = digits[randArr[j] & 15]; } } if (prefix) return "0x" + hexArr.join(""); return hexArr.join(""); }; // src/lib/safeInt.ts var POW_2_372 = Math.pow(2, 37); var POW_2_212 = Math.pow(2, 21); var POW_2_52 = Math.pow(2, 5); var safeInt = () => { const [num1, num2, num3, num4] = crypto.getRandomValues(new Uint16Array(4)); return ((num4 & POW_2_52) < 1 ? 1 : -1) * (num1 * POW_2_372 + num2 * POW_2_212 + num3 * POW_2_52 + (num4 & POW_2_52 - 1)); }; // src/lib/ifloat.ts var ifloat = () => safeInt() / Number.MAX_SAFE_INTEGER; // src/lib/percentage.ts var percentage = (input) => { if (input < 0 || input > 100) { throw new RangeError("input value should be between 0 and 100"); } return float() * 100 < input; }; // src/lib/rangeInt.ts var rangeInt = (min, max) => { if (min > max) { throw new RangeError("min must be less than or equal to max"); } return min + Math.floor(float() * (max - min + 1)); }; // src/lib/range.ts var range = (min, max) => { if (min > max) { throw new RangeError("min must be less than or equal to max"); } return min + float() * (max - min); }; // src/lib/shuffle.ts function shuffle(input) { const array = Array.from(input); for (let i = array.length - 1;i > 0; i--) { const pick = Math.floor(float() * (i + 1)); const temp = array[i]; array[i] = array[pick]; array[pick] = temp; } return typeof input === "string" ? array.join("") : array; } // src/index.ts var src_default = { bool, boolean: bool, choice, float, hex, ifloat, percentage, pick: choice, randInt: rangeInt, random: float, range, rangeInt, safeInt, shuffle, uSafeInt }; export { uSafeInt, shuffle, safeInt, rangeInt, range, float as random, rangeInt as randInt, choice as pick, percentage, ifloat, hex, float, src_default as default, choice, bool as boolean, bool };