UNPKG

remeda

Version:

A utility library for JavaScript and Typescript.

1 lines 2.38 kB
{"version":3,"file":"randomInteger.cjs","names":[],"sources":["../src/randomInteger.ts"],"sourcesContent":["import type {\n GreaterThan,\n GreaterThanOrEqual,\n IsEqual,\n IsNever,\n NonNegativeInteger,\n Or,\n} from \"type-fest\";\nimport type { IntRangeInclusive } from \"./internal/types/IntRangeInclusive\";\n\n// This limitation is defined by type-fest\ntype MaxLiteral = 1000;\n\ntype RandomInteger<From extends number, To extends number> =\n Or<\n IsNever<NonNegativeInteger<From>>,\n IsNever<NonNegativeInteger<To>>\n > extends true\n ? number\n : IsEqual<From, To> extends true\n ? From\n : GreaterThan<From, To> extends true\n ? never\n : GreaterThanOrEqual<To, MaxLiteral> extends true\n ? number\n : IntRangeInclusive<From, To>;\n\n/**\n * Generate a random integer between `from` and `to` (inclusive).\n *\n * !Important: This function uses [`Math.random()`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/random) under-the-hood, which has two major limitations:\n * 1. It generates 2^52 possible values, so the bigger the range, the less\n * uniform the distribution of values would be, and at ranges larger than that\n * some values would never come up.\n * 2. It is not cryptographically secure and should not be used for security\n * scenarios.\n *\n * @param from - The minimum value.\n * @param to - The maximum value.\n * @returns The random integer.\n * @signature\n * R.randomInteger(from, to)\n * @example\n * R.randomInteger(1, 10) // => 5\n * R.randomInteger(1.5, 2.6) // => 2\n * @dataFirst\n * @category Number\n */\nexport function randomInteger<From extends number, To extends number>(\n from: From,\n to: To,\n): RandomInteger<From, To> {\n const fromCeiled = Math.ceil(from);\n const toFloored = Math.floor(to);\n\n if (toFloored < fromCeiled) {\n throw new RangeError(\n `randomInteger: The range [${from.toString()},${to.toString()}] contains no integer`,\n );\n }\n\n return Math.floor(\n Math.random() * (toFloored - fromCeiled + 1) + fromCeiled,\n ) as RandomInteger<From, To>;\n}\n"],"mappings":"AAgDA,SAAgB,EACd,EACA,EACyB,CACzB,IAAM,EAAa,KAAK,KAAK,EAAK,CAC5B,EAAY,KAAK,MAAM,EAAG,CAEhC,GAAI,EAAY,EACd,MAAU,WACR,6BAA6B,EAAK,UAAU,CAAC,GAAG,EAAG,UAAU,CAAC,uBAC/D,CAGH,OAAO,KAAK,MACV,KAAK,QAAQ,EAAI,EAAY,EAAa,GAAK,EAChD"}