Improve random number array generation
[benchmarks-js.git] / benchmark-utils.js
CommitLineData
343cfe4f
JB
1const crypto = require('crypto')
2
3/**
4 * Generate a cryptographically secure random number in the [0,1[ range
5 *
6 * @returns
7 */
8function 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 17function generateRandomInteger (max = Number.MAX_SAFE_INTEGER, min = 0) {
343cfe4f
JB
18 if (max < 0) {
19 throw new RangeError('Invalid interval')
20 }
21 max = Math.floor(max)
da504870 22 if (min != null && min !== 0) {
343cfe4f
JB
23 if (max < min || min < 0) {
24 throw new RangeError('Invalid interval')
25 }
26 min = Math.ceil(min)
27 return Math.floor(secureRandom() * (max - min + 1)) + min
ed2968f2 28 }
343cfe4f 29 return Math.floor(secureRandom() * (max + 1))
ed2968f2
JB
30}
31
ed40d2b0
JB
32/**
33 *
34 * @param size
35 * @param max
feb629fe 36 * @param numberGenerator
ed40d2b0 37 */
feb629fe
JB
38function generateRandomNumberArray (
39 size,
40 max = Number.MAX_VALUE,
41 numberGenerator = generateRandomFloat
42) {
43 const array = []
ed40d2b0 44 for (let i = 0; i < size; i++) {
feb629fe 45 array.push(numberGenerator(max))
ed40d2b0 46 }
feb629fe
JB
47 return array
48}
49
50/**
51 *
52 * @param max
53 * @param min
54 * @param negative
55 */
56function generateRandomFloat (max = Number.MAX_VALUE, min = 0, negative = true) {
57 if (max < min || min < 0 || max < 0) {
58 throw new RangeError('Invalid interval')
59 }
60 const randomPositiveFloat = crypto.randomBytes(4).readUInt32LE() / 0xffffffff
61 const sign = negative && randomPositiveFloat < 0.5 ? -1 : 1
62 return sign * (randomPositiveFloat * (max - min) + min)
ed40d2b0
JB
63}
64
a9c78d5d
JB
65/**
66 * @param ms
7fd91296 67 * @returns
a9c78d5d
JB
68 */
69async function sleep (ms) {
70 return new Promise(resolve => setTimeout(resolve, ms))
71}
72
ed2968f2
JB
73const LIST_FORMATTER = new Intl.ListFormat('en-US', {
74 style: 'long',
75 type: 'conjunction'
76})
77
ed40d2b0
JB
78module.exports = {
79 generateRandomInteger,
feb629fe
JB
80 generateRandomFloat,
81 generateRandomNumberArray,
ed40d2b0
JB
82 sleep,
83 secureRandom,
84 LIST_FORMATTER
85}