Skip to content

Commit 56c7a95

Browse files
committed
chore: revert changes to do them in separate PR
1 parent 9d01fe3 commit 56c7a95

File tree

5 files changed

+117
-90
lines changed

5 files changed

+117
-90
lines changed

src/faker.ts

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
import type { LocaleDefinition } from './definitions';
22
import { FakerError } from './errors/faker-error';
3-
import type { Mersenne } from './internal/mersenne/mersenne';
4-
import mersenne from './internal/mersenne/mersenne';
3+
import { MersenneModule } from './internal/mersenne/mersenne';
54
import type { KnownLocale } from './locales';
65
import { AddressModule } from './modules/address';
76
import { AnimalModule } from './modules/animal';
@@ -81,7 +80,7 @@ export class Faker {
8180
readonly unique: UniqueModule['unique'] = new UniqueModule(this).unique;
8281

8382
/** @internal */
84-
private readonly _mersenne: Mersenne = mersenne();
83+
private readonly _mersenne: MersenneModule = new MersenneModule();
8584

8685
readonly random: RandomModule = new RandomModule(this);
8786

@@ -245,7 +244,11 @@ export class Faker {
245244
seed(
246245
seed: number | number[] = Math.ceil(Math.random() * Number.MAX_SAFE_INTEGER)
247246
): number | number[] {
248-
this._mersenne.seed(seed);
247+
if (Array.isArray(seed) && seed.length) {
248+
this._mersenne.seed_array(seed);
249+
} else if (!Array.isArray(seed) && !isNaN(seed)) {
250+
this._mersenne.seed(seed);
251+
}
249252

250253
return seed;
251254
}

src/internal/mersenne/mersenne.ts

Lines changed: 59 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -1,64 +1,81 @@
11
import { FakerError } from '../../errors/faker-error';
2-
import Twister from './twister';
2+
import Gen from './twister';
33

44
/**
5-
* Generate seed based random numbers.
5+
* Module to generate seed based random numbers.
66
*
77
* @internal
88
*/
9-
export interface Mersenne {
9+
export class MersenneModule {
10+
private gen = new Gen();
11+
12+
constructor() {
13+
this.gen.initGenrand(Math.ceil(Math.random() * Number.MAX_SAFE_INTEGER));
14+
15+
// Bind `this` so namespaced is working correctly
16+
for (const name of Object.getOwnPropertyNames(MersenneModule.prototype)) {
17+
if (name === 'constructor' || typeof this[name] !== 'function') {
18+
continue;
19+
}
20+
this[name] = this[name].bind(this);
21+
}
22+
}
23+
1024
/**
1125
* Generates a random number between `[min, max)`.
1226
*
1327
* @param max The maximum number. Defaults to `32768`.
1428
* @param min The minimum number. Defaults to `0`.
29+
*
30+
* @example
31+
* faker.mersenne.rand() // 15515
32+
* faker.mersenne.rand(1000, 500) // 578
33+
*
34+
* @since 5.5.0
1535
*/
16-
next(max?: number, min?: number): number;
36+
rand(max = 32768, min = 0): number {
37+
if (min > max) {
38+
const temp = min;
39+
min = max;
40+
max = temp;
41+
}
42+
43+
return Math.floor(this.gen.genrandReal2() * (max - min) + min);
44+
}
1745

1846
/**
1947
* Sets the seed to use.
2048
*
21-
* @param seed The seed to use.
22-
* @throws If the seed is not a `number` or `number[]`.
49+
* @param S The seed to use.
50+
* @throws If the seed is not a `number`.
51+
*
52+
* @since 5.5.0
2353
*/
24-
seed(seed: number | number[]): void;
25-
}
26-
27-
/**
28-
* Generate seed based random numbers.
29-
*
30-
* @internal
31-
*/
32-
export default function mersenne(): Mersenne {
33-
const twister = new Twister();
34-
35-
twister.initGenrand(Math.ceil(Math.random() * Number.MAX_SAFE_INTEGER));
36-
37-
return {
38-
next(max = 32768, min = 0): number {
39-
if (min > max) {
40-
const temp = min;
41-
min = max;
42-
max = temp;
43-
}
44-
45-
return Math.floor(twister.genrandReal2() * (max - min) + min);
46-
},
47-
48-
seed(seed: number | number[]): void {
49-
if (typeof seed === 'number') {
50-
twister.initGenrand(seed);
51-
return;
52-
}
54+
seed(S: number): void {
55+
if (typeof S !== 'number') {
56+
throw new FakerError(
57+
`seed(S) must take numeric argument; is ${typeof S}`
58+
);
59+
}
5360

54-
if (Array.isArray(seed)) {
55-
twister.initByArray(seed, seed.length);
56-
return;
57-
}
61+
this.gen.initGenrand(S);
62+
}
5863

64+
/**
65+
* Sets the seed to use.
66+
*
67+
* @param A The seed to use.
68+
* @throws If the seed is not a `number[]`.
69+
*
70+
* @since 5.5.0
71+
*/
72+
seed_array(A: number[]): void {
73+
if (typeof A !== 'object') {
5974
throw new FakerError(
60-
`seed must take numeric argument(s); is ${typeof seed}`
75+
`seed_array(A) must take array of numbers; is ${typeof A}`
6176
);
62-
},
63-
};
77+
}
78+
79+
this.gen.initByArray(A, A.length);
80+
}
6481
}

src/modules/datatype/index.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import type { Faker } from '../..';
22
import { FakerError } from '../../errors/faker-error';
33
import { deprecated } from '../../internal/deprecated';
4-
import type { Mersenne } from '../../internal/mersenne/mersenne';
4+
import type { MersenneModule } from '../../internal/mersenne/mersenne';
55

66
/**
77
* Module to generate various primitive values and data types.
@@ -56,12 +56,12 @@ export class DatatypeModule {
5656
throw new FakerError(`Max ${max} should be greater than min ${min}.`);
5757
}
5858

59-
const mersenne: Mersenne =
59+
const mersenne: MersenneModule =
6060
// @ts-expect-error: access private member field
6161
this.faker._mersenne;
6262

6363
const randomNumber = Math.floor(
64-
mersenne.next(max / precision + 1, min / precision)
64+
mersenne.rand(max / precision + 1, min / precision)
6565
);
6666

6767
// Workaround problem in float point arithmetics for e.g. 6681493 / 0.01
Lines changed: 24 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,49 +1,49 @@
11
// Vitest Snapshot v1
22

3-
exports[`mersenne twister > seed: [42,1,2] > next() 1`] = `28056`;
3+
exports[`mersenne twister > seed: [42,1,2] > rand() 1`] = `28056`;
44

5-
exports[`mersenne twister > seed: [42,1,2] > should return deterministic values for next(100, 0) 1`] = `85`;
5+
exports[`mersenne twister > seed: [42,1,2] > should return deterministic values for rand(100, 0) 1`] = `85`;
66

7-
exports[`mersenne twister > seed: [42,1,2] > should return deterministic values for next(100, undefined) 1`] = `85`;
7+
exports[`mersenne twister > seed: [42,1,2] > should return deterministic values for rand(100, undefined) 1`] = `85`;
88

9-
exports[`mersenne twister > seed: [42,1,2] > should return deterministic values for next(undefined, 0) 1`] = `28056`;
9+
exports[`mersenne twister > seed: [42,1,2] > should return deterministic values for rand(undefined, 0) 1`] = `28056`;
1010

11-
exports[`mersenne twister > seed: [1211,1,2] > next() 1`] = `29217`;
11+
exports[`mersenne twister > seed: [1211,1,2] > rand() 1`] = `29217`;
1212

13-
exports[`mersenne twister > seed: [1211,1,2] > should return deterministic values for next(100, 0) 1`] = `89`;
13+
exports[`mersenne twister > seed: [1211,1,2] > should return deterministic values for rand(100, 0) 1`] = `89`;
1414

15-
exports[`mersenne twister > seed: [1211,1,2] > should return deterministic values for next(100, undefined) 1`] = `89`;
15+
exports[`mersenne twister > seed: [1211,1,2] > should return deterministic values for rand(100, undefined) 1`] = `89`;
1616

17-
exports[`mersenne twister > seed: [1211,1,2] > should return deterministic values for next(undefined, 0) 1`] = `29217`;
17+
exports[`mersenne twister > seed: [1211,1,2] > should return deterministic values for rand(undefined, 0) 1`] = `29217`;
1818

19-
exports[`mersenne twister > seed: [1337,1,2] > next() 1`] = `5895`;
19+
exports[`mersenne twister > seed: [1337,1,2] > rand() 1`] = `5895`;
2020

21-
exports[`mersenne twister > seed: [1337,1,2] > should return deterministic values for next(100, 0) 1`] = `17`;
21+
exports[`mersenne twister > seed: [1337,1,2] > should return deterministic values for rand(100, 0) 1`] = `17`;
2222

23-
exports[`mersenne twister > seed: [1337,1,2] > should return deterministic values for next(100, undefined) 1`] = `17`;
23+
exports[`mersenne twister > seed: [1337,1,2] > should return deterministic values for rand(100, undefined) 1`] = `17`;
2424

25-
exports[`mersenne twister > seed: [1337,1,2] > should return deterministic values for next(undefined, 0) 1`] = `5895`;
25+
exports[`mersenne twister > seed: [1337,1,2] > should return deterministic values for rand(undefined, 0) 1`] = `5895`;
2626

27-
exports[`mersenne twister > seed: 42 > next() 1`] = `12272`;
27+
exports[`mersenne twister > seed: 42 > rand() 1`] = `12272`;
2828

29-
exports[`mersenne twister > seed: 42 > should return deterministic values for next(100, 0) 1`] = `37`;
29+
exports[`mersenne twister > seed: 42 > should return deterministic values for rand(100, 0) 1`] = `37`;
3030

31-
exports[`mersenne twister > seed: 42 > should return deterministic values for next(100, undefined) 1`] = `37`;
31+
exports[`mersenne twister > seed: 42 > should return deterministic values for rand(100, undefined) 1`] = `37`;
3232

33-
exports[`mersenne twister > seed: 42 > should return deterministic values for next(undefined, 0) 1`] = `12272`;
33+
exports[`mersenne twister > seed: 42 > should return deterministic values for rand(undefined, 0) 1`] = `12272`;
3434

35-
exports[`mersenne twister > seed: 1211 > next() 1`] = `30425`;
35+
exports[`mersenne twister > seed: 1211 > rand() 1`] = `30425`;
3636

37-
exports[`mersenne twister > seed: 1211 > should return deterministic values for next(100, 0) 1`] = `92`;
37+
exports[`mersenne twister > seed: 1211 > should return deterministic values for rand(100, 0) 1`] = `92`;
3838

39-
exports[`mersenne twister > seed: 1211 > should return deterministic values for next(100, undefined) 1`] = `92`;
39+
exports[`mersenne twister > seed: 1211 > should return deterministic values for rand(100, undefined) 1`] = `92`;
4040

41-
exports[`mersenne twister > seed: 1211 > should return deterministic values for next(undefined, 0) 1`] = `30425`;
41+
exports[`mersenne twister > seed: 1211 > should return deterministic values for rand(undefined, 0) 1`] = `30425`;
4242

43-
exports[`mersenne twister > seed: 1337 > next() 1`] = `8586`;
43+
exports[`mersenne twister > seed: 1337 > rand() 1`] = `8586`;
4444

45-
exports[`mersenne twister > seed: 1337 > should return deterministic values for next(100, 0) 1`] = `26`;
45+
exports[`mersenne twister > seed: 1337 > should return deterministic values for rand(100, 0) 1`] = `26`;
4646

47-
exports[`mersenne twister > seed: 1337 > should return deterministic values for next(100, undefined) 1`] = `26`;
47+
exports[`mersenne twister > seed: 1337 > should return deterministic values for rand(100, undefined) 1`] = `26`;
4848

49-
exports[`mersenne twister > seed: 1337 > should return deterministic values for next(undefined, 0) 1`] = `8586`;
49+
exports[`mersenne twister > seed: 1337 > should return deterministic values for rand(undefined, 0) 1`] = `8586`;

test/mersenne.spec.ts

Lines changed: 24 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
import { beforeAll, beforeEach, describe, expect, it } from 'vitest';
22
import { FakerError } from '../src/errors/faker-error';
3-
import type { Mersenne } from '../src/internal/mersenne/mersenne';
4-
import mersenneFn from '../src/internal/mersenne/mersenne';
3+
import { MersenneModule } from '../src/internal/mersenne/mersenne';
54
import { seededRuns } from './support/seededRuns';
65

76
const minMaxTestCases = [
@@ -10,21 +9,25 @@ const minMaxTestCases = [
109
{ max: 100, min: undefined },
1110
];
1211

13-
const functionNames = ['next'];
12+
const functionNames = ['rand'];
1413

1514
const NON_SEEDED_BASED_RUN = 25;
1615

1716
describe('mersenne twister', () => {
18-
let mersenne: Mersenne;
17+
let mersenne: MersenneModule;
1918

2019
beforeEach(() => {
21-
mersenne = mersenneFn();
20+
mersenne = new MersenneModule();
2221
});
2322

2423
for (const seed of [...seededRuns, [42, 1, 2], [1337, 1, 2], [1211, 1, 2]]) {
2524
describe(`seed: ${JSON.stringify(seed)}`, () => {
2625
beforeEach(() => {
27-
mersenne.seed(seed);
26+
if (Array.isArray(seed)) {
27+
mersenne.seed_array(seed);
28+
} else {
29+
mersenne.seed(seed);
30+
}
2831
});
2932

3033
for (const functionName of functionNames) {
@@ -36,15 +39,15 @@ describe('mersenne twister', () => {
3639
}
3740

3841
for (const { min, max } of minMaxTestCases) {
39-
it(`should return deterministic values for next(${max}, ${min})`, () => {
40-
const actual = mersenne.next(max, min);
42+
it(`should return deterministic values for rand(${max}, ${min})`, () => {
43+
const actual = mersenne.rand(max, min);
4144

4245
expect(actual).toMatchSnapshot();
4346
});
4447
}
4548

46-
it.todo(`should return 0 for next(1)`, () => {
47-
const actual = mersenne.next(1);
49+
it.todo(`should return 0 for rand(1)`, () => {
50+
const actual = mersenne.rand(1);
4851

4952
expect(actual).toEqual(0);
5053
});
@@ -63,18 +66,22 @@ describe('mersenne twister', () => {
6366
for (const seed of seeds) {
6467
describe(`random seeded tests ${JSON.stringify(seed)}`, () => {
6568
beforeAll(() => {
66-
mersenne.seed(seed);
69+
if (Array.isArray(seed)) {
70+
mersenne.seed_array(seed);
71+
} else {
72+
mersenne.seed(seed);
73+
}
6774
});
6875

6976
for (let i = 1; i <= NON_SEEDED_BASED_RUN; i++) {
70-
describe('next', () => {
77+
describe('rand', () => {
7178
it('should return a random number without given min / max arguments', () => {
72-
const randomNumber = mersenne.next();
79+
const randomNumber = mersenne.rand();
7380
expect(randomNumber).toBeTypeOf('number');
7481
});
7582

7683
it('should return random number from interval [min, max)', () => {
77-
const actual = mersenne.next(0, 2);
84+
const actual = mersenne.rand(0, 2);
7885

7986
expect(actual).toBeGreaterThanOrEqual(0);
8087
expect(actual).toBeLessThan(2);
@@ -91,18 +98,18 @@ describe('mersenne twister', () => {
9198
'abc'
9299
)
93100
).toThrowError(
94-
new FakerError('seed must take numeric argument(s); is string')
101+
new FakerError('seed(S) must take numeric argument; is string')
95102
);
96103
});
97104

98105
it('should throw an error when attempting to seed() a non-integer', () => {
99106
expect(() =>
100-
mersenne.seed(
107+
mersenne.seed_array(
101108
// @ts-expect-error: non-integer error
102109
'abc'
103110
)
104111
).toThrowError(
105-
new FakerError('seed must take numeric argument(s); is string')
112+
new FakerError('seed_array(A) must take array of numbers; is string')
106113
);
107114
});
108115
});

0 commit comments

Comments
 (0)