sliftutils 0.27.0 → 0.28.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/index.d.ts +7 -0
- package/misc/random.d.ts +3 -0
- package/misc/random.ts +45 -0
- package/package.json +1 -1
package/index.d.ts
CHANGED
|
@@ -37,6 +37,13 @@ declare module "sliftutils/misc/matchFilter" {
|
|
|
37
37
|
|
|
38
38
|
}
|
|
39
39
|
|
|
40
|
+
declare module "sliftutils/misc/random" {
|
|
41
|
+
export declare function getSeededRandom(seed: number): () => number;
|
|
42
|
+
export declare function shuffle<T>(array: T[], seed: number): T[];
|
|
43
|
+
export declare function secureRandom(): number;
|
|
44
|
+
|
|
45
|
+
}
|
|
46
|
+
|
|
40
47
|
declare module "sliftutils/misc/types" {
|
|
41
48
|
export declare function isDefined<T>(value: T | undefined | null): value is T;
|
|
42
49
|
|
package/misc/random.d.ts
ADDED
package/misc/random.ts
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { isNode } from "socket-function/src/misc";
|
|
2
|
+
import crypto from "crypto";
|
|
3
|
+
|
|
4
|
+
export function getSeededRandom(seed: number): () => number {
|
|
5
|
+
// Multiply seed by a large prime
|
|
6
|
+
seed = (seed + 0x1235234894) * 0x1fffffff % 0x7fffffff;
|
|
7
|
+
let rand = sfc32(seed, seed, seed, seed);
|
|
8
|
+
// Run a few time, to fully seed it
|
|
9
|
+
for (let i = 0; i < 10; i++) {
|
|
10
|
+
rand();
|
|
11
|
+
}
|
|
12
|
+
return rand;
|
|
13
|
+
function sfc32(a: number, b: number, c: number, d: number) {
|
|
14
|
+
return function () {
|
|
15
|
+
a >>>= 0; b >>>= 0; c >>>= 0; d >>>= 0;
|
|
16
|
+
var t = (a + b) | 0;
|
|
17
|
+
a = b ^ b >>> 9;
|
|
18
|
+
b = c + (c << 3) | 0;
|
|
19
|
+
c = (c << 21 | c >>> 11);
|
|
20
|
+
d = d + 1 | 0;
|
|
21
|
+
t = t + d | 0;
|
|
22
|
+
c = c + t | 0;
|
|
23
|
+
return (t >>> 0) / 4294967296;
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export function shuffle<T>(array: T[], seed: number) {
|
|
29
|
+
let rand = getSeededRandom(seed);
|
|
30
|
+
let indexes = Array(array.length).fill(0).map((x, i) => i);
|
|
31
|
+
let shuffleValue = indexes.map(() => rand());
|
|
32
|
+
indexes.sort((a, b) => shuffleValue[a] - shuffleValue[b]);
|
|
33
|
+
return indexes.map(i => array[i]);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
let randomData = new Uint8Array(8);
|
|
37
|
+
let randomDataF64 = new Float64Array(randomData.buffer);
|
|
38
|
+
export function secureRandom(): number {
|
|
39
|
+
if (!isNode()) {
|
|
40
|
+
window.crypto.getRandomValues(randomData);
|
|
41
|
+
} else {
|
|
42
|
+
crypto.getRandomValues(randomData);
|
|
43
|
+
}
|
|
44
|
+
return randomDataF64[0];
|
|
45
|
+
}
|