aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMatt Mayer <[email protected]>2023-01-30 20:28:53 +0700
committerGitHub <[email protected]>2023-01-30 14:28:53 +0100
commit1ebbead194a9583dbd0f21f136c9d2bf8f84a50f (patch)
tree94a75b885c01a6d16f0655a7fc74d3ffb969a609 /src
parent0663048932bb1b625fbd5c6988d70bf6b1c0bf61 (diff)
downloadfaker-1ebbead194a9583dbd0f21f136c9d2bf8f84a50f.tar.xz
faker-1ebbead194a9583dbd0f21f136c9d2bf8f84a50f.zip
feat(number)!: default to high precision float (#1675)
Diffstat (limited to 'src')
-rw-r--r--src/internal/mersenne/mersenne.ts14
-rw-r--r--src/modules/color/index.ts8
-rw-r--r--src/modules/number/index.ts38
3 files changed, 33 insertions, 27 deletions
diff --git a/src/internal/mersenne/mersenne.ts b/src/internal/mersenne/mersenne.ts
index e7c0355c..c823af7e 100644
--- a/src/internal/mersenne/mersenne.ts
+++ b/src/internal/mersenne/mersenne.ts
@@ -7,13 +7,10 @@ import Twister from './twister';
*/
export interface Mersenne {
/**
- * Generates a random number between `[min, max)`. The result is already floored.
- *
- * @param options The options to generate a random number.
- * @param options.min The minimum number.
- * @param options.max The maximum number.
+ * Generates a random float between `[0, 1)`.
+ * This method is called `next` so that it could be used as an [iterator](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Iteration_protocols#the_iterator_protocol)
*/
- next(options: { max: number; min: number }): number;
+ next(): number;
/**
* Sets the seed to use.
@@ -34,10 +31,9 @@ export default function mersenne(): Mersenne {
twister.initGenrand(Math.ceil(Math.random() * Number.MAX_SAFE_INTEGER));
return {
- next({ min, max }): number {
- return Math.floor(twister.genrandReal2() * (max - min) + min);
+ next(): number {
+ return twister.genrandReal2();
},
-
seed(seed: number | number[]): void {
if (typeof seed === 'number') {
twister.initGenrand(seed);
diff --git a/src/modules/color/index.ts b/src/modules/color/index.ts
index 9831d258..981dae60 100644
--- a/src/modules/color/index.ts
+++ b/src/modules/color/index.ts
@@ -377,7 +377,7 @@ export class ColorModule {
color = Array.from({ length: 3 }, () => this.faker.number.int(255));
if (includeAlpha) {
- color.push(this.faker.number.float());
+ color.push(this.faker.number.float({ precision: 0.01 }));
cssFunction = 'rgba';
}
@@ -458,7 +458,7 @@ export class ColorModule {
}): string | number[];
cmyk(options?: { format?: ColorFormat }): string | number[] {
const color: string | number[] = Array.from({ length: 4 }, () =>
- this.faker.number.float()
+ this.faker.number.float({ precision: 0.01 })
);
return toColorFormat(color, options?.format || 'decimal', 'cmyk');
}
@@ -568,7 +568,7 @@ export class ColorModule {
}): string | number[] {
const hsl: number[] = [this.faker.number.int(360)];
for (let i = 0; i < (options?.includeAlpha ? 3 : 2); i++) {
- hsl.push(this.faker.number.float());
+ hsl.push(this.faker.number.float({ precision: 0.01 }));
}
return toColorFormat(
@@ -674,7 +674,7 @@ export class ColorModule {
}): string | number[] {
const hsl: number[] = [this.faker.number.int(360)];
for (let i = 0; i < 2; i++) {
- hsl.push(this.faker.number.float());
+ hsl.push(this.faker.number.float({ precision: 0.01 }));
}
return toColorFormat(hsl, options?.format || 'decimal', 'hwb');
diff --git a/src/modules/number/index.ts b/src/modules/number/index.ts
index 13368990..96e5067d 100644
--- a/src/modules/number/index.ts
+++ b/src/modules/number/index.ts
@@ -81,8 +81,8 @@ export class NumberModule {
const mersenne: Mersenne =
// @ts-expect-error: access private member field
this.faker._mersenne;
-
- return mersenne.next({ min: effectiveMin, max: effectiveMax + 1 });
+ const real = mersenne.next();
+ return Math.floor(real * (effectiveMax + 1 - effectiveMin) + effectiveMin);
}
/**
@@ -91,13 +91,13 @@ export class NumberModule {
* @param options Upper bound or options object. Defaults to `{}`.
* @param options.min Lower bound for generated number. Defaults to `0.0`.
* @param options.max Upper bound for generated number. Defaults to `1.0`.
- * @param options.precision Precision of the generated number. Defaults to `0.01`.
+ * @param options.precision Precision of the generated number, for example `0.01` will round to 2 decimal points.
*
* @example
- * faker.number.float() // 0.89
- * faker.number.float(3) // 1.14
- * faker.number.float({ min: -1000000 }) // -823469.91
- * faker.number.float({ max: 100 }) // 27.28
+ * faker.number.float() // 0.5688541042618454
+ * faker.number.float(3) // 2.367973240558058
+ * faker.number.float({ min: -1000000 }) //-780678.849672846
+ * faker.number.float({ max: 100 }) // 17.3687307164073
* faker.number.float({ precision: 0.1 }) // 0.9
* faker.number.float({ min: 10, max: 100, precision: 0.001 }) // 35.415
*
@@ -133,7 +133,7 @@ export class NumberModule {
};
}
- const { min = 0, max = 1, precision = 0.01 } = options;
+ const { min = 0, max = 1, precision } = options;
if (max === min) {
return min;
@@ -143,13 +143,23 @@ export class NumberModule {
throw new FakerError(`Max ${max} should be greater than min ${min}.`);
}
- const factor = 1 / precision;
- const int = this.int({
- min: min * factor,
- max: max * factor,
- });
+ if (precision !== undefined) {
+ if (precision <= 0) {
+ throw new FakerError(`Precision should be greater than 0.`);
+ }
- return int / factor;
+ const factor = 1 / precision;
+ const int = this.int({
+ min: min * factor,
+ max: max * factor,
+ });
+ return int / factor;
+ } else {
+ // @ts-expect-error: access private member field
+ const mersenne: Mersenne = this.faker._mersenne;
+ const real = mersenne.next();
+ return real * (max - min) + min;
+ }
}
/**