UNPKG

randomize-any

Version:

A secure randomization utility library that provides various randomization functions, supporting both browser and Node.js environments.

90 lines (86 loc) 2.47 kB
'use strict'; Object.defineProperty(exports, '__esModule', { value: true }); /** * Randomize an element from an array * @param list array * @returns randomized element */ function randomizeAny(list) { const targetIndex = getSecureWeightedRandom(list.map(() => 1)); return list[targetIndex]; } /** * Randomize an integer * @param min minimum value * @param max maximum value * @returns randomized integer */ function randomizeInteger(min, max) { const list = generateArray(min, max); return randomizeAny(list); } /** * Randomize a float number * @param min minimum value * @param max maximum value * @returns randomized float number */ function randomizeFloat(min, max) { const list = generateArray(min, max, 0.01); return randomizeAny(list); } /** * Get a secure weighted random number * @param weights weight array * @returns randomized index */ function getSecureWeightedRandom(weights) { let sum = weights.reduce((acc, val) => acc + val, 0); // Calculate total weight // Generate a secure random number (range 0 ~ sum-1) let array = new Uint32Array(1); window.crypto.getRandomValues(array); let rand = array[0] / (0xFFFFFFFF + 1) * sum; // Normalize to [0, sum) // Iterate through weight array to find corresponding random index let cumulative = 0; for (let i = 0; i < weights.length; i++) { cumulative += weights[i]; if (rand < cumulative) { return i; } } return getWeightedRandom(weights); } /** * Get a weighted random number * @param weights weight array * @returns randomized index */ function getWeightedRandom(weights) { const total = weights.reduce((acc, curr) => acc + curr, 0); const random = Math.random() * total; let sum = 0; for (let i = 0; i < weights.length; i++) { sum += weights[i]; if (random < sum) { return i; } } } /** * Generate an array * @param min minimum value * @param max maximum value * @param step step size * @returns array */ function generateArray(min, max, step = 1) { const array = []; for (let i = min; i <= max; i += step) { array.push(i); } return array; } exports.getSecureWeightedRandom = getSecureWeightedRandom; exports.randomizeAny = randomizeAny; exports.randomizeFloat = randomizeFloat; exports.randomizeInteger = randomizeInteger;