Bump eslint from 8.28.0 to 8.29.0
[benchmarks-js.git] / benchmark-utils.js
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
12 /**
13 * @param max
14 * @param min
15 * @returns
16 */
17 function generateRandomInteger (max = Number.MAX_SAFE_INTEGER, min = 0) {
18 if (max < min || max < 0 || min < 0) {
19 throw new RangeError('Invalid interval')
20 }
21 max = Math.floor(max)
22 if (min != null && min !== 0) {
23 min = Math.ceil(min)
24 return Math.floor(secureRandom() * (max - min + 1)) + min
25 }
26 return Math.floor(secureRandom() * (max + 1))
27 }
28
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
45 /**
46 *
47 * @param size
48 * @param max
49 * @param numberGenerator
50 * @returns
51 */
52 function generateRandomNumberArray (
53 size,
54 max = Number.MAX_VALUE,
55 numberGenerator = generateRandomFloat
56 ) {
57 const array = []
58 for (let i = 0; i < size; i++) {
59 array.push(numberGenerator(max))
60 }
61 return array
62 }
63
64 /**
65 * @param ms
66 * @returns
67 */
68 async function sleep (ms) {
69 return new Promise(resolve => setTimeout(resolve, ms))
70 }
71
72 module.exports = {
73 generateRandomInteger,
74 generateRandomFloat,
75 generateRandomNumberArray,
76 sleep,
77 secureRandom
78 }