diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/internal/mersenne/mersenne.ts | 14 | ||||
| -rw-r--r-- | src/modules/color/index.ts | 8 | ||||
| -rw-r--r-- | src/modules/number/index.ts | 38 |
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; + } } /** |
