1- import { assertIsInteger } from './assertion/assertIsInteger .js' ;
1+ import { assertIsSafeInteger } from './assertion/assertIsSafeInteger .js' ;
22import { isObject } from './predicate/isObject.js' ;
33
44import type { RequireAtLeastOne } from './types/records.js' ;
@@ -18,20 +18,26 @@ export function randomInt(options?: RandomIntOptions): number;
1818export function randomInt ( min : number , max ?: number ) : number ;
1919
2020export function randomInt ( arg1 ?: number | RandomIntOptions , arg2 ?: number ) : number {
21- const { min = Number . MIN_SAFE_INTEGER , max = Number . MAX_SAFE_INTEGER } = isObject ( arg1 )
22- ? arg1
23- : { min : arg1 , max : arg2 } ;
21+ const { min = 0 , max = Number . MAX_SAFE_INTEGER } = isObject ( arg1 ) ? arg1 : { min : arg1 , max : arg2 } ;
2422
25- assertIsInteger ( min , 'min must be an integer' ) ;
26- assertIsInteger ( max , 'max must be an integer' ) ;
23+ assertIsSafeInteger ( min , 'min must be a safe integer' ) ;
24+ assertIsSafeInteger ( max , 'max must be a safe integer' ) ;
2725
28- if ( min === max ) {
29- return min ;
30- }
31-
32- if ( min > max ) {
26+ if ( min >= max ) {
3327 throw new RangeError ( 'min must be less than max' ) ;
3428 }
3529
36- return Math . floor ( Math . random ( ) * ( max - min ) ) + min ;
30+ const minBigInt = BigInt ( min ) ;
31+ const range = BigInt ( max ) - minBigInt ;
32+ const limit = ( 2n ** 64n / range ) * range ;
33+ const data = new BigInt64Array ( 1 ) ;
34+
35+ let value : bigint ;
36+
37+ do {
38+ crypto . getRandomValues ( data ) ;
39+ value = BigInt . asUintN ( 64 , data [ 0 ] ! ) ;
40+ } while ( value >= limit ) ;
41+
42+ return Number ( minBigInt + ( value % range ) ) ;
3743}
0 commit comments