X-Git-Url: https://git.piment-noir.org/?a=blobdiff_plain;f=benchmark-utils.js;h=678a2b3b80ae28a7367ade71a1993ee77b45d640;hb=47006ddf6055b02dd084ae91269f12b44ce8225d;hp=4de6ea7728d45765c65573991495c9fb3979f374;hpb=a9c78d5d3394dce4eccd9f244c88879666cba677;p=benchmarks-js.git diff --git a/benchmark-utils.js b/benchmark-utils.js index 4de6ea7..678a2b3 100644 --- a/benchmark-utils.js +++ b/benchmark-utils.js @@ -1,16 +1,72 @@ +const crypto = require('crypto') + +/** + * Generate a cryptographically secure random number in the [0,1[ range + * + * @returns + */ +function secureRandom () { + return crypto.randomBytes(4).readUInt32LE() / 0x100000000 +} + +/** + * @param max + * @param min + * @returns + */ +function generateRandomInteger (max = Number.MAX_SAFE_INTEGER, min = 0) { + if (max < 0) { + throw new RangeError('Invalid interval') + } + max = Math.floor(max) + if (min != null && min !== 0) { + if (max < min || min < 0) { + throw new RangeError('Invalid interval') + } + min = Math.ceil(min) + return Math.floor(secureRandom() * (max - min + 1)) + min + } + return Math.floor(secureRandom() * (max + 1)) +} + +/** + * + * @param size + * @param max + * @param numberGenerator + * @returns + */ +function generateRandomNumberArray ( + size, + max = Number.MAX_VALUE, + numberGenerator = generateRandomFloat +) { + const array = [] + for (let i = 0; i < size; i++) { + array.push(numberGenerator(max)) + } + return array +} + /** + * * @param max * @param min + * @param negative + * @returns */ -function generateRandomInteger (max, min = 0) { - if (min) { - return Math.floor(Math.random() * (max - min + 1) + min) +function generateRandomFloat (max = Number.MAX_VALUE, min = 0, negative = true) { + if (max < min || min < 0 || max < 0) { + throw new RangeError('Invalid interval') } - return Math.floor(Math.random() * max + 1) + const randomPositiveFloat = crypto.randomBytes(4).readUInt32LE() / 0xffffffff + const sign = negative && randomPositiveFloat < 0.5 ? -1 : 1 + return sign * (randomPositiveFloat * (max - min) + min) } /** * @param ms + * @returns */ async function sleep (ms) { return new Promise(resolve => setTimeout(resolve, ms)) @@ -21,4 +77,11 @@ const LIST_FORMATTER = new Intl.ListFormat('en-US', { type: 'conjunction' }) -module.exports = { generateRandomInteger, sleep, LIST_FORMATTER } +module.exports = { + generateRandomInteger, + generateRandomFloat, + generateRandomNumberArray, + sleep, + secureRandom, + LIST_FORMATTER +}