aboutsummaryrefslogtreecommitdiff
path: root/src/utils/mersenne.ts
diff options
context:
space:
mode:
authorDivisionByZero <[email protected]>2024-09-26 17:50:05 +0200
committerGitHub <[email protected]>2024-09-26 17:50:05 +0200
commit9537dfddba882bd93d9a429697fd44bc72428426 (patch)
treef60b5b694d5e4e8ddab228aeb20c7b7746685edc /src/utils/mersenne.ts
parent424b120a4d94b15b6e77c04a0aaffd0016a9c870 (diff)
downloadfaker-9537dfddba882bd93d9a429697fd44bc72428426.tar.xz
faker-9537dfddba882bd93d9a429697fd44bc72428426.zip
infra: update file structure for util/internal (#3141)
Diffstat (limited to 'src/utils/mersenne.ts')
-rw-r--r--src/utils/mersenne.ts48
1 files changed, 48 insertions, 0 deletions
diff --git a/src/utils/mersenne.ts b/src/utils/mersenne.ts
new file mode 100644
index 00000000..de415f91
--- /dev/null
+++ b/src/utils/mersenne.ts
@@ -0,0 +1,48 @@
+import { MersenneTwister19937 } from '../internal/mersenne';
+import type { Randomizer } from '../randomizer';
+
+/**
+ * Generates a MersenneTwister19937 randomizer with 32 bits of precision.
+ * This is the default randomizer used by faker prior to v9.0.
+ */
+export function generateMersenne32Randomizer(): Randomizer {
+ const twister = new MersenneTwister19937();
+
+ twister.initGenrand(Math.ceil(Math.random() * Number.MAX_SAFE_INTEGER));
+
+ return {
+ next(): number {
+ return twister.genrandReal2();
+ },
+ seed(seed: number | number[]): void {
+ if (typeof seed === 'number') {
+ twister.initGenrand(seed);
+ } else if (Array.isArray(seed)) {
+ twister.initByArray(seed, seed.length);
+ }
+ },
+ };
+}
+
+/**
+ * Generates a MersenneTwister19937 randomizer with 53 bits of precision.
+ * This is the default randomizer used by faker starting with v9.0.
+ */
+export function generateMersenne53Randomizer(): Randomizer {
+ const twister = new MersenneTwister19937();
+
+ twister.initGenrand(Math.ceil(Math.random() * Number.MAX_SAFE_INTEGER));
+
+ return {
+ next(): number {
+ return twister.genrandRes53();
+ },
+ seed(seed: number | number[]): void {
+ if (typeof seed === 'number') {
+ twister.initGenrand(seed);
+ } else if (Array.isArray(seed)) {
+ twister.initByArray(seed, seed.length);
+ }
+ },
+ };
+}