aboutsummaryrefslogtreecommitdiff
path: root/src/randomizer.ts
diff options
context:
space:
mode:
authorST-DDT <[email protected]>2023-10-04 18:13:00 +0200
committerGitHub <[email protected]>2023-10-04 18:13:00 +0200
commit5410239245b4a6fe8c1976f8aa33c970923f9f40 (patch)
tree7640a15dfc6781311082a6a7e7a87412d7abcf98 /src/randomizer.ts
parent88b2443cab22ade0488643568896b64adef420b5 (diff)
downloadfaker-5410239245b4a6fe8c1976f8aa33c970923f9f40.tar.xz
faker-5410239245b4a6fe8c1976f8aa33c970923f9f40.zip
feat: support custom randomizer (#2284)
Diffstat (limited to 'src/randomizer.ts')
-rw-r--r--src/randomizer.ts65
1 files changed, 65 insertions, 0 deletions
diff --git a/src/randomizer.ts b/src/randomizer.ts
new file mode 100644
index 00000000..3264ec1d
--- /dev/null
+++ b/src/randomizer.ts
@@ -0,0 +1,65 @@
+/**
+ * Interface for a random number generator.
+ *
+ * **Note:** Normally there is no need to implement this interface directly,
+ * unless you want to achieve a specific goal with it.
+ *
+ * This interface enables you to use random generators from third party libraries such as [pure-rand](https://github.com/dubzzz/pure-rand).
+ *
+ * Instances are expected to be ready for use before being passed to any Faker constructor,
+ * this includes being `seed()`ed with either a random or fixed value.
+ *
+ * For more information please refer to the [documentation](/api/randomizer).
+ *
+ * @example
+ * import { Faker, Randomizer, SimpleFaker } from '@faker-js/faker';
+ * import { RandomGenerator, xoroshiro128plus } from 'pure-rand';
+ *
+ * function generatePureRandRandomizer(
+ * seed: number | number[] = Date.now() ^ (Math.random() * 0x100000000),
+ * factory: (seed: number) => RandomGenerator = xoroshiro128plus
+ * ): Randomizer {
+ * const self = {
+ * next: () => (self.generator.unsafeNext() >>> 0) / 0x100000000,
+ * seed: (seed: number | number[]) => {
+ * self.generator = factory(typeof seed === 'number' ? seed : seed[0]);
+ * },
+ * } as Randomizer & { generator: RandomGenerator };
+ * self.seed(seed);
+ * return self;
+ * }
+ *
+ * const randomizer = generatePureRandRandomizer();
+ *
+ * const simpleFaker = new SimpleFaker({ randomizer });
+ *
+ * const faker = new Faker({
+ * locale: ...,
+ * randomizer,
+ * });
+ */
+export interface Randomizer {
+ /**
+ * Generates a random float between 0 (inclusive) and 1 (exclusive).
+ *
+ * @example
+ * randomizer.next() // 0.3404027920160495
+ * randomizer.next() // 0.929890375900335
+ * randomizer.next() // 0.5866362918861691
+ */
+ next(): number;
+
+ /**
+ * Sets the seed to use.
+ *
+ * @param seed The seed to use.
+ *
+ * @example
+ * // Random seeds
+ * randomizer.seed(Date.now() ^ (Math.random() * 0x100000000));
+ * // Fixed seeds (for reproducibility)
+ * randomizer.seed(42);
+ * randomizer.seed([42, 13.37]);
+ */
+ seed(seed: number | number[]): void;
+}