1 import crypto, { webcrypto } from 'crypto'
4 * Generate a cryptographically secure random number in the [0,1[ range
7 export function secureRandom () {
8 return crypto.randomBytes(4).readUInt32LE() / 0x100000000
12 * Generate a cryptographically secure random number in the [0,1[ range
15 export function secureRandomWithRandomValues () {
16 return webcrypto.getRandomValues(new Uint32Array(1))[0] / 0x100000000
24 export function generateRandomInteger (max = Number.MAX_SAFE_INTEGER, min = 0) {
25 if (max < min || max < 0 || min < 0) {
26 throw new RangeError('Invalid interval')
29 if (min != null && min !== 0) {
31 return Math.floor(secureRandom() * (max - min + 1)) + min
33 return Math.floor(secureRandom() * (max + 1))
42 export function generateRandomFloat (max = Number.MAX_VALUE, min = 0) {
44 throw new RangeError('Invalid interval')
46 if (max - min === Infinity) {
47 throw new RangeError('Invalid interval')
49 return (crypto.randomBytes(4).readUInt32LE() / 0xffffffff) * (max - min) + min
56 * @param numberGenerator
59 export function generateRandomNumberArray (
61 max = Number.MAX_VALUE,
62 numberGenerator = generateRandomFloat
65 for (let i = 0; i < size; i++) {
66 array.push(numberGenerator(max))
75 * @param numberGenerator
78 export function generateRandomObject (
80 numberMax = Number.MAX_VALUE,
81 numberGenerator = generateRandomFloat
83 const size = generateRandomInteger(sizeMax)
85 for (let i = 0; i < size; i++) {
86 object[i.toString()] = numberGenerator(numberMax)
95 export async function sleep (ms) {
96 return new Promise((resolve) => setTimeout(resolve, ms))