diff options
| author | ST-DDT <[email protected]> | 2024-02-27 20:57:27 +0100 |
|---|---|---|
| committer | GitHub <[email protected]> | 2024-02-27 19:57:27 +0000 |
| commit | 4ab073164beab2bf690d7fffc7773e7b76d8e07e (patch) | |
| tree | 1549dc0aba1646f27edcc00f1651f74a0b5b21fb /src | |
| parent | 0d4cba637cdd38e7757ecca1b7eae75d7a737fa8 (diff) | |
| download | faker-4ab073164beab2bf690d7fffc7773e7b76d8e07e.tar.xz faker-4ab073164beab2bf690d7fffc7773e7b76d8e07e.zip | |
feat!: high precision random number generator (#2357)
Diffstat (limited to 'src')
| -rw-r--r-- | src/faker.ts | 2 | ||||
| -rw-r--r-- | src/index.ts | 4 | ||||
| -rw-r--r-- | src/internal/mersenne.ts | 27 | ||||
| -rw-r--r-- | src/simple-faker.ts | 6 |
4 files changed, 32 insertions, 7 deletions
diff --git a/src/faker.ts b/src/faker.ts index c4f65187..5f5e14ce 100644 --- a/src/faker.ts +++ b/src/faker.ts @@ -152,7 +152,7 @@ export class Faker extends SimpleFaker { * Specify this only if you want to use it to achieve a specific goal, * such as sharing the same random generator with other instances/tools. * - * @default generateMersenne32Randomizer() + * @default generateMersenne53Randomizer() */ randomizer?: Randomizer; }) { diff --git a/src/index.ts b/src/index.ts index 4fb24bc4..33ec9e2e 100644 --- a/src/index.ts +++ b/src/index.ts @@ -72,6 +72,10 @@ export type { export { FakerError } from './errors/faker-error'; export { Faker } from './faker'; export type { FakerOptions } from './faker'; +export { + generateMersenne32Randomizer, + generateMersenne53Randomizer, +} from './internal/mersenne'; export * from './locale'; export { fakerEN as faker } from './locale'; export * from './locales'; diff --git a/src/internal/mersenne.ts b/src/internal/mersenne.ts index 2372e364..d01b5ee9 100644 --- a/src/internal/mersenne.ts +++ b/src/internal/mersenne.ts @@ -328,9 +328,7 @@ export class MersenneTwister19937 { /** * Generates a MersenneTwister19937 randomizer with 32 bits of precision. - * This is the default randomizer used by Faker. - * - * @internal + * This is the default randomizer used by faker prior to v9.0. */ export function generateMersenne32Randomizer(): Randomizer { const twister = new MersenneTwister19937(); @@ -350,3 +348,26 @@ export function generateMersenne32Randomizer(): Randomizer { }, }; } + +/** + * 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); + } + }, + }; +} diff --git a/src/simple-faker.ts b/src/simple-faker.ts index 3993392d..e775cbc7 100644 --- a/src/simple-faker.ts +++ b/src/simple-faker.ts @@ -1,4 +1,4 @@ -import { generateMersenne32Randomizer } from './internal/mersenne'; +import { generateMersenne53Randomizer } from './internal/mersenne'; import { DatatypeModule } from './modules/datatype'; import { SimpleDateModule } from './modules/date'; import { SimpleHelpersModule } from './modules/helpers'; @@ -117,12 +117,12 @@ export class SimpleFaker { * Specify this only if you want to use it to achieve a specific goal, * such as sharing the same random generator with other instances/tools. * - * @default generateMersenne32Randomizer() + * @default generateMersenne53Randomizer() */ randomizer?: Randomizer; } = {} ) { - const { randomizer = generateMersenne32Randomizer() } = options; + const { randomizer = generateMersenne53Randomizer() } = options; this._randomizer = randomizer; } |
