aboutsummaryrefslogtreecommitdiff
path: root/src/randomizer.ts
blob: a0bc14bfaaeca3ea8d865e54ca52958d867b6430 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
/**
 * 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](https://fakerjs.dev/api/randomizer.html).
 *
 * @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,
 * });
 *
 * @since 8.2.0
 */
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
   *
   * @since 8.2.0
   */
  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]);
   *
   * @since 8.2.0
   */
  seed(seed: number | number[]): void;
}