Skip to content

Commit 5852d6e

Browse files
committed
Refactor to support providing an options object
1 parent f4b8a7d commit 5852d6e

File tree

7 files changed

+112
-33
lines changed

7 files changed

+112
-33
lines changed

lib/node_modules/@stdlib/random/base/minstd/README.md

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -48,18 +48,24 @@ var v = minstd.normalized();
4848
// returns <number>
4949
```
5050

51-
#### minstd.factory( \[seed] )
51+
#### minstd.factory( \[options] )
5252

5353
Returns a linear congruential pseudorandom number generator ([LCG][lcg]).
5454

5555
```javascript
5656
var rand = minstd.factory();
5757
```
5858

59+
The function accepts the following `options`:
60+
61+
- **seed**: pseudorandom number generator seed.
62+
5963
By default, a random integer is used to seed the returned generator. To seed the generator, provide an `integer` on the interval `[1, 2147483646]`.
6064

6165
```javascript
62-
var rand = minstd.factory( 1234 );
66+
var rand = minstd.factory({
67+
'seed': 1234
68+
});
6369

6470
var v = rand();
6571
// returns 20739838
@@ -89,7 +95,9 @@ for ( i = 0; i < 100; i++ ) {
8995
}
9096

9197
// Generate the same pseudorandom values...
92-
rand = minstd.factory( minstd.SEED );
98+
rand = minstd.factory({
99+
'seed': minstd.SEED
100+
});
93101
for ( i = 0; i < 100; i++ ) {
94102
v = rand();
95103
}
@@ -148,13 +156,17 @@ for ( i = 0; i < 100; i++ ) {
148156

149157
// Create a new pseudorandom number generator...
150158
seed = 1234;
151-
rand = minstd.factory( seed );
159+
rand = minstd.factory({
160+
'seed': seed
161+
});
152162
for ( i = 0; i < 100; i++ ) {
153163
console.log( rand() );
154164
}
155165

156166
// Create another pseudorandom number generator using a previous seed...
157-
rand = minstd.factory( minstd.SEED );
167+
rand = minstd.factory({
168+
'seed': minstd.SEED
169+
});
158170
for ( i = 0; i < 100; i++ ) {
159171
console.log( rand() );
160172
}

lib/node_modules/@stdlib/random/base/minstd/docs/repl.txt

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,12 +37,15 @@
3737
> var r = {{alias}}.normalized();
3838

3939

40-
{{alias}}.factory( [seed] )
40+
{{alias}}.factory( [options] )
4141
Returns a linear congruential pseudorandom number generator (LCG).
4242

4343
Parameters
4444
----------
45-
seed: integer (optional)
45+
options: Object (optional)
46+
Options.
47+
48+
options.seed: integer (optional)
4649
Pseudorandom number generator seed. Must be on the interval
4750
`[1, 2147483646]`.
4851

@@ -59,7 +62,7 @@
5962
> r = rand();
6063

6164
// Provide a seed:
62-
> rand = {{alias}}.factory( 1234 );
65+
> rand = {{alias}}.factory( { 'seed': 1234 } );
6366
> r = rand()
6467
20739838
6568

lib/node_modules/@stdlib/random/base/minstd/examples/index.js

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,14 +32,18 @@ for ( i = 0; i < 100; i++ ) {
3232

3333
// Create a new pseudorandom number generator...
3434
seed = 1234;
35-
rand = minstd.factory( seed );
35+
rand = minstd.factory({
36+
'seed': seed
37+
});
3638
console.log( '\nseed: %d', seed );
3739
for ( i = 0; i < 100; i++ ) {
3840
console.log( rand() );
3941
}
4042

4143
// Create another pseudorandom number generator using a previous seed...
42-
rand = minstd.factory( minstd.SEED );
44+
rand = minstd.factory({
45+
'seed': minstd.SEED
46+
});
4347
console.log( '\nseed: %d', minstd.SEED );
4448
for ( i = 0; i < 100; i++ ) {
4549
console.log( rand() );

lib/node_modules/@stdlib/random/base/minstd/lib/factory.js

Lines changed: 25 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@
2121
// MODULES //
2222

2323
var setReadOnly = require( '@stdlib/utils/define-read-only-property' );
24+
var hasOwnProp = require( '@stdlib/assert/has-own-property' );
25+
var isObject = require( '@stdlib/assert/is-plain-object' );
2426
var isPositiveInteger = require( '@stdlib/assert/is-positive-integer' ).isPrimitive;
2527
var INT32_MAX = require( '@stdlib/constants/math/int32-max' );
2628
var randint32 = require( './rand_int32.js' );
@@ -38,9 +40,11 @@ var A = 16807|0; // asm type annotation
3840
/**
3941
* Returns a linear congruential pseudorandom number generator (LCG) based on Park and Miller.
4042
*
41-
* @param {PositiveInteger} [seed] - pseudorandom number generator seed
42-
* @throws {TypeError} must provide a positive integer
43-
* @throws {RangeError} must provide a positive integer less than the maximum signed 32-bit integer
43+
* @param {Options} [options] - options
44+
* @param {PositiveInteger} [options.seed] - pseudorandom number generator seed
45+
* @throws {TypeError} options argument must be an object
46+
* @throws {TypeError} `seed` option must be a positive integer
47+
* @throws {RangeError} `seed` option must be a positive integer less than the maximum signed 32-bit integer
4448
* @returns {Function} LCG
4549
*
4650
* @example
@@ -51,21 +55,32 @@ var A = 16807|0; // asm type annotation
5155
*
5256
* @example
5357
* // Return a seeded LCG:
54-
* var minstd = factory( 1234 );
58+
* var minstd = factory({
59+
* 'seed': 1234
60+
* });
5561
*
5662
* var v = minstd();
5763
* // returns 20739838
5864
*/
59-
function factory( seed ) {
65+
function factory( options ) {
6066
var state;
67+
var seed;
6168
if ( arguments.length ) {
62-
if ( !isPositiveInteger( seed ) ) {
63-
throw new TypeError( 'invalid argument. Must provide a positive integer. Value: `' + seed + '`.' );
69+
if ( !isObject( options ) ) {
70+
throw new TypeError( 'invalid argument. Options argument must be an object. Value: `' + options + '`.' );
6471
}
65-
if ( seed > MAX_SEED ) {
66-
throw new RangeError( 'invalid argument. Must provide a positive integer less than the maximum signed 32-bit integer. Value: `' + seed + '`.' );
72+
if ( hasOwnProp( options, 'seed' ) ) {
73+
seed = options.seed;
74+
if ( !isPositiveInteger( seed ) ) {
75+
throw new TypeError( 'invalid option. `seed` option must be a positive integer. Option: `' + seed + '`.' );
76+
}
77+
if ( seed > MAX_SEED ) {
78+
throw new RangeError( 'invalid option. `seed` option must be a positive integer less than the maximum signed 32-bit integer. Option: `' + seed + '`.' );
79+
}
80+
state = seed|0; // asm type annotation
81+
} else {
82+
state = randint32()|0; // asm type annotation
6783
}
68-
state = seed|0; // asm type annotation
6984
} else {
7085
state = randint32()|0; // asm type annotation
7186
}

lib/node_modules/@stdlib/random/base/minstd/lib/index.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,9 @@
3232
* @example
3333
* var factory = require( '@stdlib/random/base/minstd' ).factory;
3434
*
35-
* var minstd = factory( 1234 );
35+
* var minstd = factory({
36+
* 'seed': 1234
37+
* });
3638
*
3739
* var v = minstd();
3840
* // returns 20739838

lib/node_modules/@stdlib/random/base/minstd/lib/minstd.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,9 @@ var randint32 = require( './rand_int32.js' );
9595
* var v = minstd();
9696
* // returns <number>
9797
*/
98-
var minstd = factory( randint32() );
98+
var minstd = factory({
99+
'seed': randint32()
100+
});
99101

100102

101103
// EXPORTS //

lib/node_modules/@stdlib/random/base/minstd/test/test.factory.js

Lines changed: 52 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
var tape = require( 'tape' );
2424
var ENV = require( '@stdlib/process/env' );
2525
var INT32_MAX = require( '@stdlib/constants/math/int32-max' );
26-
var round = require( '@stdlib/math/base/special/round' );
26+
var now = require( '@stdlib/time/now' );
2727
var isPositiveInteger = require( '@stdlib/math/base/assert/is-positive-integer' );
2828
var kstest = require( '@stdlib/stats/kstest' );
2929
var factory = require( './../lib/factory.js' );
@@ -44,7 +44,35 @@ tape( 'main export is a function', function test( t ) {
4444
t.end();
4545
});
4646

47-
tape( 'if provided a value which is not a positive integer, the factory function throws an error', function test( t ) {
47+
tape( 'if provided an options argument which is not an object, the factory function throws an error', function test( t ) {
48+
var values;
49+
var i;
50+
51+
values = [
52+
'5',
53+
3,
54+
NaN,
55+
true,
56+
false,
57+
null,
58+
void 0,
59+
[],
60+
function noop() {}
61+
];
62+
63+
for ( i = 0; i < values.length; i++ ) {
64+
t.throws( badValue( values[i] ), TypeError, 'throws a type error when provided '+values[i] );
65+
}
66+
t.end();
67+
68+
function badValue( value ) {
69+
return function badValue() {
70+
factory( value );
71+
};
72+
}
73+
});
74+
75+
tape( 'if provided a `seed` which is not a positive integer, the factory function throws an error', function test( t ) {
4876
var values;
4977
var i;
5078

@@ -55,8 +83,9 @@ tape( 'if provided a value which is not a positive integer, the factory function
5583
-5.0,
5684
NaN,
5785
true,
86+
false,
5887
null,
59-
undefined,
88+
void 0,
6089
[],
6190
{},
6291
function noop() {}
@@ -69,12 +98,14 @@ tape( 'if provided a value which is not a positive integer, the factory function
6998

7099
function badValue( value ) {
71100
return function badValue() {
72-
factory( value );
101+
factory({
102+
'seed': value
103+
});
73104
};
74105
}
75106
});
76107

77-
tape( 'the function throws a range error if provided an integer greater than or equal to the maximum signed 32-bit integer', function test( t ) {
108+
tape( 'the function throws a range error if provided `seed` greater than or equal to the maximum signed 32-bit integer', function test( t ) {
78109
var values;
79110
var i;
80111

@@ -91,7 +122,9 @@ tape( 'the function throws a range error if provided an integer greater than or
91122

92123
function badValue( value ) {
93124
return function badValue() {
94-
factory( value );
125+
factory({
126+
'seed': value
127+
});
95128
};
96129
}
97130
});
@@ -119,10 +152,14 @@ tape( 'the function returns a seeded pseudorandom number generator', function te
119152
var v2;
120153
var i;
121154

122-
seed = round( Date.now() / 1000 );
155+
seed = now();
123156

124-
minstd1 = factory( seed );
125-
minstd2 = factory( seed );
157+
minstd1 = factory({
158+
'seed': seed
159+
});
160+
minstd2 = factory({
161+
'seed': seed
162+
});
126163

127164
t.notEqual( minstd1, minstd2, 'separate generators' );
128165

@@ -141,7 +178,9 @@ tape( 'attached to the returned function is the generator name', function test(
141178
});
142179

143180
tape( 'attached to the returned function is the generator seed', function test( t ) {
144-
var minstd = factory( 12345 );
181+
var minstd = factory({
182+
'seed': 12345
183+
});
145184
t.equal( typeof minstd.SEED, 'number', 'has `SEED` property' );
146185
t.equal( minstd.SEED, 12345, 'equal to provided seed' );
147186
t.end();
@@ -180,7 +219,9 @@ tape( 'attached to the `normalized` method is the generator name', function test
180219
});
181220

182221
tape( 'attached to the `normalized` method is the generator seed', function test( t ) {
183-
var minstd = factory( 12345 );
222+
var minstd = factory({
223+
'seed': 12345
224+
});
184225
t.equal( typeof minstd.normalized.SEED, 'number', 'has `SEED` property' );
185226
t.equal( minstd.normalized.SEED, 12345, 'equal to provided seed' );
186227
t.end();

0 commit comments

Comments
 (0)