aboutsummaryrefslogtreecommitdiff
path: root/docs/guide
diff options
context:
space:
mode:
authorST-DDT <[email protected]>2024-02-27 20:57:27 +0100
committerGitHub <[email protected]>2024-02-27 19:57:27 +0000
commit4ab073164beab2bf690d7fffc7773e7b76d8e07e (patch)
tree1549dc0aba1646f27edcc00f1651f74a0b5b21fb /docs/guide
parent0d4cba637cdd38e7757ecca1b7eae75d7a737fa8 (diff)
downloadfaker-4ab073164beab2bf690d7fffc7773e7b76d8e07e.tar.xz
faker-4ab073164beab2bf690d7fffc7773e7b76d8e07e.zip
feat!: high precision random number generator (#2357)
Diffstat (limited to 'docs/guide')
-rw-r--r--docs/guide/randomizer.md17
-rw-r--r--docs/guide/upgrading_v9/2357.md72
2 files changed, 89 insertions, 0 deletions
diff --git a/docs/guide/randomizer.md b/docs/guide/randomizer.md
index e03152a7..16df1209 100644
--- a/docs/guide/randomizer.md
+++ b/docs/guide/randomizer.md
@@ -12,6 +12,23 @@ There are two connected use cases we have considered where this might be needed:
1. Re-Use of the same `Randomizer` within multiple `Faker` instances.
2. The use of a random number generator from a third party library.
+## Built-In `Randomizer`s
+
+Faker ships with two variations
+
+```ts
+import {
+ generateMersenne32Randomizer, // Default prior to v9
+ generateMersenne53Randomizer, // Default since v9
+} from '@faker-js/faker';
+
+const randomizer = generateMersenne53Randomizer();
+```
+
+The 32bit `Randomizer` is faster, but the 53bit `Randomizer` generates better random values (with significantly fewer duplicates).
+
+But you can also implement your own by implementing the [related interface](/api/randomizer.html).
+
## Using `Randomizer`s
A `Randomizer` has to be set during construction of the instance:
diff --git a/docs/guide/upgrading_v9/2357.md b/docs/guide/upgrading_v9/2357.md
new file mode 100644
index 00000000..28a530c3
--- /dev/null
+++ b/docs/guide/upgrading_v9/2357.md
@@ -0,0 +1,72 @@
+# Use High Precision RNG by default
+
+TLDR: Many Faker methods will return a different result in v9 compared to v8 for the same seed.
+
+In v9 we switch from a 32 bit random value to a 53 bit random value.
+We don't change the underlying algorithm much, but we now consume two seed values each step instead of one.
+This affects generated values in two ways:
+
+- In large lists or long numbers the values are spread more evenly.
+ This also reduces the number of duplicates it generates.
+ For `faker.number.int()` this reduces the number of duplicates from `1 / 10_000` to less than `1 / 8_000_000`.
+- If you start with the same initial seed to generate a value, you might see some changes in the results you get.
+ This is because we're now working with a higher precision, which affects how numbers are rounded off.
+ As a result, the methods we use might produce slightly different outcomes.
+ And since we are now using two seed values each time subsequent results appear to skip a value each time.
+
+```ts
+import {
+ SimpleFaker,
+ generateMersenne32Randomizer,
+ generateMersenne53Randomizer,
+} from '@faker-js/faker';
+
+// < v9 default
+const f32 = new SimpleFaker({ randomizer: generateMersenne32Randomizer() });
+f32.seed(123);
+const r32 = f32.helpers.multiple(() => f32.number.int(10), { count: 10 });
+// > v9 default
+const f53 = new SimpleFaker({ randomizer: generateMersenne53Randomizer() });
+f53.seed(123);
+const r53 = f53.helpers.multiple(() => f53.number.int(10), { count: 5 });
+
+diff(r32, r53);
+//[
+// 7,
+// 7, // [!code --]
+// 3,
+// 4, // [!code --]
+// 2,
+// 7, // [!code --]
+// 6,
+// 7, // [!code --]
+// 7,
+// 5, // [!code --]
+//]
+```
+
+## Adoption
+
+If you don't have any seeded tests and just want some random values, then you don't have to change anything.
+
+If you have seeded tests, you have to update most test snapshots or similar comparisons to new values.
+
+If you are using vitest, you can do that using `pnpm vitest run -u`.
+
+## Keeping the old behavior
+
+You can keep the old behavior, if you create your own `Faker` instance
+and pass a `Randomizer` instance from the `generateMersenne32Randomizer()` function to it.
+
+```ts{8}
+import {
+ Faker,
+ generateMersenne32Randomizer, // < v9 default
+ generateMersenne53Randomizer, // > v9 default
+} from '@faker-js/faker';
+
+const faker = new Faker({
+ randomizer: generateMersenne32Randomizer(),
+ ...
+});
+```