aboutsummaryrefslogtreecommitdiff
path: root/src/modules/mersenne/index.ts
diff options
context:
space:
mode:
authorShinigami <[email protected]>2022-05-03 15:48:20 +0200
committerGitHub <[email protected]>2022-05-03 15:48:20 +0200
commita2da7c496e9a3741d165ddfe6128b50837fec361 (patch)
tree88d371bc19487bc8a34d9043035aed8e4fedd7d5 /src/modules/mersenne/index.ts
parentcc46a0c19af2752b6210c24b715fcce20197b6d9 (diff)
downloadfaker-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.ts73
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);
+ }
+}