diff options
| author | Shinigami <[email protected]> | 2022-05-03 15:48:20 +0200 |
|---|---|---|
| committer | GitHub <[email protected]> | 2022-05-03 15:48:20 +0200 |
| commit | a2da7c496e9a3741d165ddfe6128b50837fec361 (patch) | |
| tree | 88d371bc19487bc8a34d9043035aed8e4fedd7d5 /src/modules/mersenne/index.ts | |
| parent | cc46a0c19af2752b6210c24b715fcce20197b6d9 (diff) | |
| download | faker-a2da7c496e9a3741d165ddfe6128b50837fec361.tar.xz faker-a2da7c496e9a3741d165ddfe6128b50837fec361.zip | |
refactor!: reorganize src folder (#909)
Diffstat (limited to 'src/modules/mersenne/index.ts')
| -rw-r--r-- | src/modules/mersenne/index.ts | 73 |
1 files changed, 73 insertions, 0 deletions
diff --git a/src/modules/mersenne/index.ts b/src/modules/mersenne/index.ts new file mode 100644 index 00000000..33e610f8 --- /dev/null +++ b/src/modules/mersenne/index.ts @@ -0,0 +1,73 @@ +import { FakerError } from '../../errors/faker-error'; +import Gen from './twister'; + +/** + * Module to generate seed based random numbers. + */ +export class Mersenne { + private gen = new Gen(); + + constructor() { + this.gen.initGenrand(new Date().getTime() % 1000000000); + + // Bind `this` so namespaced is working correctly + for (const name of Object.getOwnPropertyNames(Mersenne.prototype)) { + if (name === 'constructor' || typeof this[name] !== 'function') { + continue; + } + this[name] = this[name].bind(this); + } + } + + /** + * Generates a random number between `[min, max)`. + * + * @param max The maximum number. Defaults to `0`. + * @param min The minimum number. Defaults to `32768`. + * + * @example + * faker.mersenne.rand() // 15515 + * faker.mersenne.rand(500, 1000) // 578 + */ + rand(max = 32768, min = 0): number { + if (min > max) { + const temp = min; + min = max; + max = temp; + } + + return Math.floor(this.gen.genrandReal2() * (max - min) + min); + } + + /** + * Sets the seed to use. + * + * @param S The seed to use. + * @throws If the seed is not a `number`. + */ + seed(S: number): void { + if (typeof S !== 'number') { + throw new FakerError( + `seed(S) must take numeric argument; is ${typeof S}` + ); + } + + this.gen.initGenrand(S); + } + + /** + * Sets the seed to use. + * + * @param A The seed to use. + * @throws If the seed is not a `number[]`. + */ + seed_array(A: number[]): void { + if (typeof A !== 'object') { + throw new FakerError( + `seed_array(A) must take array of numbers; is ${typeof A}` + ); + } + + this.gen.initByArray(A, A.length); + } +} |
