@@ -2,48 +2,19 @@ import { RandomGenerator } from '../../generator/RandomGenerator';
2
2
3
3
/**
4
4
* Uniformly generate number in range [0 ; rangeSize[
5
+ * With rangeSize <= 0x100000000
5
6
* @internal
6
7
*/
7
8
export function unsafeUniformIntDistributionInternal ( rangeSize : number , rng : RandomGenerator ) : number {
8
9
const MinRng = - 0x80000000 ;
9
10
const NumValues = 0x100000000 ;
10
11
11
- // Range provided by the RandomGenerator is large enough
12
- if ( rangeSize <= NumValues ) {
13
- const MaxAllowed = NumValues - ( NumValues % rangeSize ) ;
14
- let deltaV = rng . unsafeNext ( ) - MinRng ;
15
- while ( deltaV >= MaxAllowed ) {
16
- deltaV = rng . unsafeNext ( ) - MinRng ;
17
- }
18
- return deltaV % rangeSize ; // Warning: we expect NumValues <= 2**32, so diff too
12
+ // Range provided by the RandomGenerator is large enough,
13
+ // given rangeSize <= 0x100000000 and RandomGenerator is uniform on 0x100000000 values
14
+ const MaxAllowed = NumValues - ( NumValues % rangeSize ) ;
15
+ let deltaV = rng . unsafeNext ( ) - MinRng ;
16
+ while ( deltaV >= MaxAllowed ) {
17
+ deltaV = rng . unsafeNext ( ) - MinRng ;
19
18
}
20
-
21
- // Compute number of iterations required to have enough random
22
- // to build uniform entries in the asked range
23
- let FinalNumValues = NumValues * NumValues ;
24
- let NumIterations = 2 ; // At least 2 (at this point in the code)
25
- while ( FinalNumValues < rangeSize ) {
26
- FinalNumValues *= NumValues ;
27
- ++ NumIterations ;
28
- }
29
- const MaxAcceptedRandom = rangeSize * Math . floor ( ( 1 * FinalNumValues ) / rangeSize ) ;
30
-
31
- let largeDeltaV = unsafeComputeValue ( rng , NumIterations , NumValues , MinRng ) ;
32
- while ( largeDeltaV >= MaxAcceptedRandom ) {
33
- largeDeltaV = unsafeComputeValue ( rng , NumIterations , NumValues , MinRng ) ;
34
- }
35
- const inDiff = largeDeltaV - rangeSize * Math . floor ( ( 1 * largeDeltaV ) / rangeSize ) ;
36
- return inDiff ;
37
- }
38
-
39
- /**
40
- * Aggregate multiple calls to next() into a single random value
41
- */
42
- function unsafeComputeValue ( rng : RandomGenerator , NumIterations : number , NumValues : number , MinRng : number ) : number {
43
- let value = 0 ;
44
- for ( let num = 0 ; num !== NumIterations ; ++ num ) {
45
- const out = rng . unsafeNext ( ) ;
46
- value = NumValues * value + ( out - MinRng ) ; // Warning: we overflow may when diff > max_safe (eg: =max_safe-min_safe+1)
47
- }
48
- return value ;
19
+ return deltaV % rangeSize ; // Warning: we expect NumValues <= 2**32, so diff too
49
20
}
0 commit comments