build(deps-dev): apply updates
[benchmarks-js.git] / random.mjs
CommitLineData
f45b29bf 1import { randomInt } from 'node:crypto'
f522d7b9
JB
2import Benchmark from 'benny'
3import {
99d76a65
JB
4 secureRandom,
5 secureRandomWithRandomValues
95d31631 6} from './benchmark-utils.mjs'
aa697b2f 7
804a6375 8const maximum = 281474976710654
aa697b2f 9
aa697b2f
JB
10/**
11 * @param max
12 * @param min
7fd91296 13 * @returns
aa697b2f 14 */
f10b1da0 15function getSecureRandomInteger (max = Number.MAX_SAFE_INTEGER, min = 0) {
7e861288
JB
16 if (max < min || max < 0 || min < 0) {
17 throw new RangeError('Invalid interval')
18 }
aa697b2f 19 max = Math.floor(max)
4cc567bb 20 if (min !== 0) {
aa697b2f
JB
21 min = Math.ceil(min)
22 return Math.floor(secureRandom() * (max - min + 1)) + min
23 }
24 return Math.floor(secureRandom() * (max + 1))
25}
26
99d76a65
JB
27/**
28 * @param max
29 * @param min
30 * @returns
31 */
32function getSecureRandomIntegerWithRandomValues (
33 max = Number.MAX_SAFE_INTEGER,
34 min = 0
35) {
36 if (max < min || max < 0 || min < 0) {
37 throw new RangeError('Invalid interval')
38 }
39 max = Math.floor(max)
4cc567bb 40 if (min !== 0) {
99d76a65
JB
41 min = Math.ceil(min)
42 return Math.floor(secureRandomWithRandomValues() * (max - min + 1)) + min
43 }
44 return Math.floor(secureRandomWithRandomValues() * (max + 1))
45}
46
aa697b2f
JB
47/**
48 * @param max
49 * @param min
7fd91296 50 * @returns
aa697b2f 51 */
f10b1da0 52function getRandomInteger (max = Number.MAX_SAFE_INTEGER, min = 0) {
7e861288
JB
53 if (max < min || max < 0 || min < 0) {
54 throw new RangeError('Invalid interval')
55 }
aa697b2f 56 max = Math.floor(max)
4cc567bb 57 if (min !== 0) {
aa697b2f
JB
58 min = Math.ceil(min)
59 return Math.floor(Math.random() * (max - min + 1)) + min
60 }
61 return Math.floor(Math.random() * (max + 1))
62}
63
f10b1da0
JB
64Benchmark.suite(
65 'Random Integer Generator',
e2bfb549 66 Benchmark.add('Secure random integer generator', () => {
aa697b2f 67 getSecureRandomInteger(maximum)
f10b1da0 68 }),
99d76a65
JB
69 Benchmark.add(
70 'Secure random with getRandomValues() integer generator',
71 () => {
72 getSecureRandomIntegerWithRandomValues(maximum)
73 }
74 ),
804a6375
JB
75 Benchmark.add('Crypto random integer generator', (max = maximum, min = 0) => {
76 max = Math.floor(max)
4cc567bb 77 if (min !== 0) {
804a6375 78 min = Math.ceil(min)
f45b29bf 79 return Math.floor(randomInt(min, max + 1))
804a6375 80 }
f45b29bf 81 return Math.floor(randomInt(max + 1))
99d76a65
JB
82 }),
83 Benchmark.add('Math random integer generator', () => {
aa697b2f 84 getRandomInteger(maximum)
f10b1da0
JB
85 }),
86 Benchmark.cycle(),
87 Benchmark.complete(),
fb341cfe
JB
88 Benchmark.save({
89 file: 'random-integer-generator',
90 format: 'json',
91 details: true
92 }),
93 Benchmark.save({
94 file: 'random-integer-generator',
95 format: 'chart.html',
96 details: true
97 }),
98 Benchmark.save({
99 file: 'random-integer-generator',
100 format: 'table.html',
101 details: true
102 })
4aa2893a 103).catch(console.error)