Commit | Line | Data |
---|---|---|
343cfe4f JB |
1 | const crypto = require('crypto') |
2 | ||
3 | /** | |
4 | * Generate a cryptographically secure random number in the [0,1[ range | |
5 | * | |
6 | * @returns | |
7 | */ | |
8 | function secureRandom () { | |
9 | return crypto.randomBytes(4).readUInt32LE() / 0x100000000 | |
10 | } | |
11 | ||
e9bfc28e JB |
12 | /** |
13 | * @param max | |
14 | * @param min | |
7fd91296 | 15 | * @returns |
e9bfc28e | 16 | */ |
f10b1da0 | 17 | function generateRandomInteger (max = Number.MAX_SAFE_INTEGER, min = 0) { |
aa418e78 | 18 | if (max < min || max < 0 || min < 0) { |
343cfe4f JB |
19 | throw new RangeError('Invalid interval') |
20 | } | |
21 | max = Math.floor(max) | |
da504870 | 22 | if (min != null && min !== 0) { |
343cfe4f JB |
23 | min = Math.ceil(min) |
24 | return Math.floor(secureRandom() * (max - min + 1)) + min | |
ed2968f2 | 25 | } |
343cfe4f | 26 | return Math.floor(secureRandom() * (max + 1)) |
ed2968f2 JB |
27 | } |
28 | ||
aa418e78 JB |
29 | /** |
30 | * | |
31 | * @param max | |
32 | * @param min | |
33 | * @param negative | |
34 | * @returns | |
35 | */ | |
36 | function generateRandomFloat (max = Number.MAX_VALUE, min = 0, negative = true) { | |
37 | if (max < min || max < 0 || min < 0) { | |
38 | throw new RangeError('Invalid interval') | |
39 | } | |
40 | const randomPositiveFloat = crypto.randomBytes(4).readUInt32LE() / 0xffffffff | |
41 | const sign = negative && randomPositiveFloat < 0.5 ? -1 : 1 | |
42 | return sign * (randomPositiveFloat * (max - min) + min) | |
43 | } | |
44 | ||
ed40d2b0 JB |
45 | /** |
46 | * | |
47 | * @param size | |
48 | * @param max | |
feb629fe | 49 | * @param numberGenerator |
67bc7194 | 50 | * @returns |
ed40d2b0 | 51 | */ |
feb629fe JB |
52 | function generateRandomNumberArray ( |
53 | size, | |
54 | max = Number.MAX_VALUE, | |
55 | numberGenerator = generateRandomFloat | |
56 | ) { | |
57 | const array = [] | |
ed40d2b0 | 58 | for (let i = 0; i < size; i++) { |
feb629fe | 59 | array.push(numberGenerator(max)) |
ed40d2b0 | 60 | } |
feb629fe JB |
61 | return array |
62 | } | |
63 | ||
a9c78d5d JB |
64 | /** |
65 | * @param ms | |
7fd91296 | 66 | * @returns |
a9c78d5d JB |
67 | */ |
68 | async function sleep (ms) { | |
69 | return new Promise(resolve => setTimeout(resolve, ms)) | |
70 | } | |
71 | ||
ed40d2b0 JB |
72 | module.exports = { |
73 | generateRandomInteger, | |
feb629fe JB |
74 | generateRandomFloat, |
75 | generateRandomNumberArray, | |
ed40d2b0 | 76 | sleep, |
2bacb639 | 77 | secureRandom |
ed40d2b0 | 78 | } |