aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorPiotr Kuczynski <[email protected]>2022-03-31 19:14:26 +0200
committerGitHub <[email protected]>2022-03-31 17:14:26 +0000
commit0b350f929624a1247f35549c61148ec93e5f0c0a (patch)
tree2728578354fd6255234fca9498f47c23d793945f /src
parent58439edf1506c53f9f3b082b9b0f22ba7e8cccf4 (diff)
downloadfaker-0b350f929624a1247f35549c61148ec93e5f0c0a.tar.xz
faker-0b350f929624a1247f35549c61148ec93e5f0c0a.zip
chore: move vendor to utils and update license notes (#738)
Diffstat (limited to 'src')
-rw-r--r--src/internet.ts2
-rw-r--r--src/mersenne.ts2
-rw-r--r--src/unique.ts4
-rw-r--r--src/utils/mersenne.ts320
-rw-r--r--src/utils/unique.ts (renamed from src/vendor/unique.ts)0
-rw-r--r--src/utils/user-agent.ts (renamed from src/vendor/user-agent.ts)46
-rw-r--r--src/vendor/mersenne.ts342
7 files changed, 355 insertions, 361 deletions
diff --git a/src/internet.ts b/src/internet.ts
index 1ed6a837..8961af9e 100644
--- a/src/internet.ts
+++ b/src/internet.ts
@@ -1,5 +1,5 @@
import type { Faker } from '.';
-import * as random_ua from './vendor/user-agent';
+import * as random_ua from './utils/user-agent';
/**
* Module to generate internet related entries.
diff --git a/src/mersenne.ts b/src/mersenne.ts
index 521456a1..d9044e54 100644
--- a/src/mersenne.ts
+++ b/src/mersenne.ts
@@ -1,4 +1,4 @@
-import Gen from './vendor/mersenne';
+import Gen from './utils/mersenne';
/**
* Module to generate seed based random numbers.
diff --git a/src/unique.ts b/src/unique.ts
index 718b3391..b19f6132 100644
--- a/src/unique.ts
+++ b/src/unique.ts
@@ -1,5 +1,5 @@
-import type { RecordKey } from './vendor/unique';
-import * as uniqueExec from './vendor/unique';
+import type { RecordKey } from './utils/unique';
+import * as uniqueExec from './utils/unique';
/**
* Module to generate unique entries.
diff --git a/src/utils/mersenne.ts b/src/utils/mersenne.ts
new file mode 100644
index 00000000..5859f3ae
--- /dev/null
+++ b/src/utils/mersenne.ts
@@ -0,0 +1,320 @@
+/**
+ * Copyright (c) 2022 Faker
+ *
+ * This is a version of the original source code migrated to TypeScript and
+ * modified by the Faker team.
+ *
+ * Check LICENSE for more details on copyright.
+ *
+ * -----------------------------------------------------------------------------
+ *
+ * Copyright (c) 2006 Y. Okada
+ *
+ * This program is a JavaScript version of Mersenne Twister, with concealment
+ * and encapsulation in class, an almost straight conversion from the original
+ * program, mt19937ar.c, translated by Y. Okada on July 17, 2006, and modified
+ * a little at July 20, 2006, but there are not any substantial differences.
+ *
+ * In this program, procedure descriptions and comments of original source code
+ * were not removed.
+ *
+ * Lines commented with //c// were originally descriptions of c procedure.
+ * And a few following lines are appropriate JavaScript descriptions.
+ *
+ * Lines commented with /* and *\/ are original comments.
+ * Lines commented with // are additional comments in this JavaScript version.
+ *
+ * Before using this version, create at least one instance of
+ * MersenneTwister19937 class, and initialize the each state, given below
+ * in C comments, of all the instances.
+ *
+ * -----------------------------------------------------------------------------
+ *
+ * A C-program for MT19937, with initialization improved 2002/1/26.
+ * Coded by Takuji Nishimura and Makoto Matsumoto.
+ *
+ * Before using, initialize the state by using init_genrand(seed)
+ * or init_by_array(init_key, key_length).
+ *
+ * Copyright (C) 1997 - 2002, Makoto Matsumoto and Takuji Nishimura,
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ *
+ * 3. The names of its contributors may not be used to endorse or promote
+ * products derived from this software without specific prior written
+ * permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
+ * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * Any feedback is very welcome.
+ * http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/emt.html
+ * email: m-mat @ math.sci.hiroshima-u.ac.jp (remove space)
+ */
+
+export default class MersenneTwister19937 {
+ private readonly N = 624;
+ private readonly M = 397;
+ private readonly MATRIX_A = 0x9908b0df; // constant vector a
+ private readonly UPPER_MASK = 0x80000000; // most significant w-r bits
+ private readonly LOWER_MASK = 0x7fffffff; // least significant r bits
+ private mt: number[] = new Array(this.N); // the array for the state vector
+ private mti = this.N + 1; // mti==N+1 means mt[N] is not initialized
+
+ /**
+ * Returns a 32-bits unsigned integer from an operand to which applied a bit
+ * operator.
+ *
+ * @param n1 number to unsign
+ */
+ private unsigned32(n1: number): number {
+ return n1 < 0 ? (n1 ^ this.UPPER_MASK) + this.UPPER_MASK : n1;
+ }
+
+ /**
+ * Emulates lowerflow of a c 32-bits unsigned integer variable, instead of
+ * the operator -. These both arguments must be non-negative integers
+ * expressible using unsigned 32 bits.
+ *
+ * @param n1 dividend
+ * @param n2 divisor
+ */
+ private subtraction32(n1: number, n2: number): number {
+ return n1 < n2
+ ? this.unsigned32((0x100000000 - (n2 - n1)) & 0xffffffff)
+ : n1 - n2;
+ }
+
+ /**
+ * Emulates overflow of a c 32-bits unsigned integer variable, instead of the operator +.
+ * these both arguments must be non-negative integers expressible using unsigned 32 bits.
+ *
+ * @param n1 number one for addition
+ * @param n2 number two for addition
+ */
+ private addition32(n1: number, n2: number): number {
+ return this.unsigned32((n1 + n2) & 0xffffffff);
+ }
+
+ /**
+ * Emulates overflow of a c 32-bits unsigned integer variable, instead of the operator *.
+ * These both arguments must be non-negative integers expressible using unsigned 32 bits.
+ *
+ * @param n1 number one for multiplication
+ * @param n2 number two for multiplication
+ */
+ private multiplication32(n1: number, n2: number): number {
+ let sum = 0;
+ for (let i = 0; i < 32; ++i) {
+ if ((n1 >>> i) & 0x1) {
+ sum = this.addition32(sum, this.unsigned32(n2 << i));
+ }
+ }
+ return sum;
+ }
+
+ /**
+ * Initializes mt[N] with a seed.
+ *
+ * @param seed the seed to use
+ */
+ initGenrand(seed: number): void {
+ this.mt[0] = this.unsigned32(seed & 0xffffffff);
+ for (this.mti = 1; this.mti < this.N; this.mti++) {
+ this.mt[this.mti] =
+ //(1812433253 * (mt[mti-1] ^ (mt[mti-1] >> 30)) + mti);
+ this.addition32(
+ this.multiplication32(
+ 1812433253,
+ this.unsigned32(
+ this.mt[this.mti - 1] ^ (this.mt[this.mti - 1] >>> 30)
+ )
+ ),
+ this.mti
+ );
+
+ /* See Knuth TAOCP Vol2. 3rd Ed. P.106 for multiplier. */
+ /* In the previous versions, MSBs of the seed affect */
+ /* only MSBs of the array mt[]. */
+ /* 2002/01/09 modified by Makoto Matsumoto */
+ this.mt[this.mti] = this.unsigned32(this.mt[this.mti] & 0xffffffff);
+ }
+ }
+
+ /**
+ * Initialize by an array with array-length.
+ *
+ * @param initKey is the array for initializing keys
+ * @param keyLength is its length
+ */
+ initByArray(initKey: number[], keyLength: number): void {
+ this.initGenrand(19650218);
+ let i = 1;
+ let j = 0;
+ let k = this.N > keyLength ? this.N : keyLength;
+ for (; k; k--) {
+ // mt[i] = (mt[i] ^ ((mt[i-1] ^ (mt[i-1] >> 30)) * 1664525)) + init_key[j] + j;
+ this.mt[i] = this.addition32(
+ this.addition32(
+ this.unsigned32(
+ this.mt[i] ^
+ this.multiplication32(
+ this.unsigned32(this.mt[i - 1] ^ (this.mt[i - 1] >>> 30)),
+ 1664525
+ )
+ ),
+ initKey[j]
+ ),
+ j
+ );
+ // mt[i] &= 0xffffffff; for WORDSIZE > 32 machines
+ this.mt[i] = this.unsigned32(this.mt[i] & 0xffffffff);
+ i++;
+ j++;
+ if (i >= this.N) {
+ this.mt[0] = this.mt[this.N - 1];
+ i = 1;
+ }
+ if (j >= keyLength) {
+ j = 0;
+ }
+ }
+ for (k = this.N - 1; k; k--) {
+ // mt[i] = (mt[i] ^ ((mt[i-1] ^ (mt[i-1] >> 30)) * 1566083941)) - i
+ this.mt[i] = this.subtraction32(
+ this.unsigned32(
+ this.mt[i] ^
+ this.multiplication32(
+ this.unsigned32(this.mt[i - 1] ^ (this.mt[i - 1] >>> 30)),
+ 1566083941
+ )
+ ),
+ i
+ );
+ // mt[i] &= 0xffffffff; for WORDSIZE > 32 machines
+ this.mt[i] = this.unsigned32(this.mt[i] & 0xffffffff);
+ i++;
+ if (i >= this.N) {
+ this.mt[0] = this.mt[this.N - 1];
+ i = 1;
+ }
+ }
+ this.mt[0] = 0x80000000; // MSB is 1; assuring non-zero initial array
+ }
+
+ // moved outside of genrandInt32() by jwatte 2010-11-17; generate less garbage
+ private mag01 = [0x0, this.MATRIX_A];
+
+ /**
+ * Generates a random number on [0,2^32]-interval
+ */
+ genrandInt32(): number {
+ let y: number;
+
+ if (this.mti >= this.N) {
+ // generate N words at one time
+ let kk: number;
+
+ // if initGenrand() has not been called a default initial seed is used
+ if (this.mti === this.N + 1) {
+ this.initGenrand(5489);
+ }
+
+ for (kk = 0; kk < this.N - this.M; kk++) {
+ y = this.unsigned32(
+ (this.mt[kk] & this.UPPER_MASK) | (this.mt[kk + 1] & this.LOWER_MASK)
+ );
+
+ this.mt[kk] = this.unsigned32(
+ this.mt[kk + this.M] ^ (y >>> 1) ^ this.mag01[y & 0x1]
+ );
+ }
+
+ for (; kk < this.N - 1; kk++) {
+ y = this.unsigned32(
+ (this.mt[kk] & this.UPPER_MASK) | (this.mt[kk + 1] & this.LOWER_MASK)
+ );
+
+ this.mt[kk] = this.unsigned32(
+ this.mt[kk + (this.M - this.N)] ^ (y >>> 1) ^ this.mag01[y & 0x1]
+ );
+ }
+
+ y = this.unsigned32(
+ (this.mt[this.N - 1] & this.UPPER_MASK) | (this.mt[0] & this.LOWER_MASK)
+ );
+
+ this.mt[this.N - 1] = this.unsigned32(
+ this.mt[this.M - 1] ^ (y >>> 1) ^ this.mag01[y & 0x1]
+ );
+
+ this.mti = 0;
+ }
+
+ y = this.mt[this.mti++];
+
+ // Tempering
+ y = this.unsigned32(y ^ (y >>> 11));
+ y = this.unsigned32(y ^ ((y << 7) & 0x9d2c5680));
+ y = this.unsigned32(y ^ ((y << 15) & 0xefc60000));
+ y = this.unsigned32(y ^ (y >>> 18));
+
+ return y;
+ }
+
+ /**
+ * Generates a random number on [0,2^32]-interval
+ */
+ genrandInt31(): number {
+ return this.genrandInt32() >>> 1;
+ }
+
+ /**
+ * Generates a random number on [0,1]-real-interval
+ */
+ genrandReal1(): number {
+ return this.genrandInt32() * (1.0 / 4294967295.0); // divided by 2^32-1
+ }
+
+ /**
+ * Generates a random number on [0,1)-real-interval
+ */
+ genrandReal2(): number {
+ return this.genrandInt32() * (1.0 / 4294967296.0); // divided by 2^32
+ }
+
+ /**
+ * Generates a random number on (0,1)-real-interval
+ */
+ genrandReal3(): number {
+ return (this.genrandInt32() + 0.5) * (1.0 / 4294967296.0); // divided by 2^32
+ }
+
+ /**
+ * Generates a random number on [0,1) with 53-bit resolution
+ */
+ genrandRes53(): number {
+ const a = this.genrandInt32() >>> 5,
+ b = this.genrandInt32() >>> 6;
+ return (a * 67108864.0 + b) * (1.0 / 9007199254740992.0);
+ }
+ // These real versions are due to Isaku Wada, 2002/01/09
+}
diff --git a/src/vendor/unique.ts b/src/utils/unique.ts
index 78d0fdfc..78d0fdfc 100644
--- a/src/vendor/unique.ts
+++ b/src/utils/unique.ts
diff --git a/src/vendor/user-agent.ts b/src/utils/user-agent.ts
index 9218c6e5..7f7e8cbb 100644
--- a/src/vendor/user-agent.ts
+++ b/src/utils/user-agent.ts
@@ -1,29 +1,45 @@
-/*
+/**
+ * Copyright (c) 2022 Faker
+ *
+ * This is a version of the original code migrated to TypeScript and modified
+ * by the Faker team.
+ *
+ * Check LICENSE for more details about the copyright.
+ *
+ * -----------------------------------------------------------------------------
+ *
* Copyright (c) 2012-2014 Jeffrey Mealo
*
- * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated
- * documentation files (the "Software"), to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and
- * to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
*
- * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the
- * Software.
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
*
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
- * WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
- * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
- * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
*
- * ------------------------------------------------------------------------------------------------------------------------
+ * -----------------------------------------------------------------------------
*
- * Based loosely on Luka Pusic's PHP Script: http://360percents.com/posts/php-random-user-agent-generator/
+ * Based loosely on Luka Pusic's PHP Script:
+ * http://360percents.com/posts/php-random-user-agent-generator/
*
* The license for that script is as follows:
*
* "THE BEER-WARE LICENSE" (Revision 42):
*
- * <[email protected]> wrote this file. As long as you retain this notice you can do whatever you want with this stuff.
- * If we meet some day, and you think this stuff is worth it, you can buy me a beer in return. Luka Pusic
+ * <[email protected]> wrote this file. As long as you retain this notice you
+ * can do whatever you want with this stuff. If we meet some day, and you think
+ * this stuff is worth it, you can buy me a beer in return. Luka Pusic
*/
import type { Faker } from '..';
diff --git a/src/vendor/mersenne.ts b/src/vendor/mersenne.ts
deleted file mode 100644
index 23e44f2c..00000000
--- a/src/vendor/mersenne.ts
+++ /dev/null
@@ -1,342 +0,0 @@
-// this program is a JavaScript version of Mersenne Twister, with concealment and encapsulation in class,
-// an almost straight conversion from the original program, mt19937ar.c,
-// translated by y. okada on July 17, 2006.
-// and modified a little at july 20, 2006, but there are not any substantial differences.
-// in this program, procedure descriptions and comments of original source code were not removed.
-// lines commented with //c// were originally descriptions of c procedure. and a few following lines are appropriate JavaScript descriptions.
-// lines commented with /* and */ are original comments.
-// lines commented with // are additional comments in this JavaScript version.
-// before using this version, create at least one instance of MersenneTwister19937 class, and initialize the each state, given below in c comments, of all the instances.
-
-/*
- * A C-program for MT19937, with initialization improved 2002/1/26.
- * Coded by Takuji Nishimura and Makoto Matsumoto.
- *
- * Before using, initialize the state by using init_genrand(seed)
- * or init_by_array(init_key, key_length).
- *
- * Copyright (C) 1997 - 2002, Makoto Matsumoto and Takuji Nishimura,
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * 3. The names of its contributors may not be used to endorse or promote
- * products derived from this software without specific prior written
- * permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
- * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- *
- * Any feedback is very welcome.
- * http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/emt.html
- * email: m-mat @ math.sci.hiroshima-u.ac.jp (remove space)
- */
-
-export default class MersenneTwister19937 {
- /* constants should be scoped inside the class */
- /* Period parameters */
- //c//#define N 624
- //c//#define M 397
- //c//#define MATRIX_A 0x9908b0dfUL /* constant vector a */
- //c//#define UPPER_MASK 0x80000000UL /* most significant w-r bits */
- //c//#define LOWER_MASK 0x7fffffffUL /* least significant r bits */
- private readonly N = 624;
- private readonly M = 397;
- private readonly MATRIX_A = 0x9908b0df; /* constant vector a */
- private readonly UPPER_MASK = 0x80000000; /* most significant w-r bits */
- private readonly LOWER_MASK = 0x7fffffff; /* least significant r bits */
- //c//static unsigned long mt[N]; /* the array for the state vector */
- //c//static int mti=N+1; /* mti==N+1 means mt[N] is not initialized */
- private mt: number[] = new Array(
- this.N
- ); /* the array for the state vector */
- private mti = this.N + 1; /* mti==N+1 means mt[N] is not initialized */
-
- /**
- * Returns a 32-bits unsiged integer from an operand to which applied a bit operator.
- *
- * @param n1 number to unsign
- */
- private unsigned32(n1: number): number {
- // returns a 32-bits unsiged integer from an operand to which applied a bit operator.
- return n1 < 0 ? (n1 ^ this.UPPER_MASK) + this.UPPER_MASK : n1;
- }
-
- /**
- * Emulates lowerflow of a c 32-bits unsiged integer variable, instead of the operator -.
- * These both arguments must be non-negative integers expressible using unsigned 32 bits.
- *
- * @param n1 dividend
- * @param n2 divisor
- */
- private subtraction32(n1: number, n2: number): number {
- return n1 < n2
- ? this.unsigned32((0x100000000 - (n2 - n1)) & 0xffffffff)
- : n1 - n2;
- }
-
- /**
- * emulates overflow of a c 32-bits unsiged integer variable, instead of the operator +.
- * these both arguments must be non-negative integers expressible using unsigned 32 bits.
- *
- * @param n1 number one for addition
- * @param n2 number two for addition
- */
- private addition32(n1: number, n2: number): number {
- return this.unsigned32((n1 + n2) & 0xffffffff);
- }
-
- /**
- * Emulates overflow of a c 32-bits unsiged integer variable, instead of the operator *.
- * These both arguments must be non-negative integers expressible using unsigned 32 bits.
- *
- * @param n1 number one for multiplication
- * @param n2 number two for multiplication
- */
- private multiplication32(n1: number, n2: number): number {
- let sum = 0;
- for (let i = 0; i < 32; ++i) {
- if ((n1 >>> i) & 0x1) {
- sum = this.addition32(sum, this.unsigned32(n2 << i));
- }
- }
- return sum;
- }
-
- /**
- * Initializes mt[N] with a seed.
- *
- * @param seed the seed to use
- */
- //c//void init_genrand(unsigned long s)
- initGenrand(seed: number): void {
- //c//mt[0]= s & 0xffffffff;
- this.mt[0] = this.unsigned32(seed & 0xffffffff);
- for (this.mti = 1; this.mti < this.N; this.mti++) {
- this.mt[this.mti] =
- //c//(1812433253 * (mt[mti-1] ^ (mt[mti-1] >> 30)) + mti);
- this.addition32(
- this.multiplication32(
- 1812433253,
- this.unsigned32(
- this.mt[this.mti - 1] ^ (this.mt[this.mti - 1] >>> 30)
- )
- ),
- this.mti
- );
- /* See Knuth TAOCP Vol2. 3rd Ed. P.106 for multiplier. */
- /* In the previous versions, MSBs of the seed affect */
- /* only MSBs of the array mt[]. */
- /* 2002/01/09 modified by Makoto Matsumoto */
- //c//mt[mti] &= 0xffffffff;
- this.mt[this.mti] = this.unsigned32(this.mt[this.mti] & 0xffffffff);
- /* for >32 bit machines */
- }
- }
-
- /**
- * Initialize by an array with array-length.
- *
- * @param initKey is the array for initializing keys
- * @param keyLength is its length
- */
- /* slight change for C++, 2004/2/26 */
- //c//void init_by_array(unsigned long init_key[], int key_length)
- initByArray(initKey: number[], keyLength: number): void {
- //c//init_genrand(19650218);
- this.initGenrand(19650218);
- let i = 1;
- let j = 0;
- let k = this.N > keyLength ? this.N : keyLength;
- for (; k; k--) {
- //c//mt[i] = (mt[i] ^ ((mt[i-1] ^ (mt[i-1] >> 30)) * 1664525))
- //c// + init_key[j] + j; /* non linear */
- this.mt[i] = this.addition32(
- this.addition32(
- this.unsigned32(
- this.mt[i] ^
- this.multiplication32(
- this.unsigned32(this.mt[i - 1] ^ (this.mt[i - 1] >>> 30)),
- 1664525
- )
- ),
- initKey[j]
- ),
- j
- );
- //c//mt[i] &= 0xffffffff; /* for WORDSIZE > 32 machines */
- this.mt[i] = this.unsigned32(this.mt[i] & 0xffffffff);
- i++;
- j++;
- if (i >= this.N) {
- this.mt[0] = this.mt[this.N - 1];
- i = 1;
- }
- if (j >= keyLength) {
- j = 0;
- }
- }
- for (k = this.N - 1; k; k--) {
- //c//mt[i] = (mt[i] ^ ((mt[i-1] ^ (mt[i-1] >> 30)) * 1566083941))
- //c//- i; /* non linear */
- this.mt[i] = this.subtraction32(
- this.unsigned32(
- this.mt[i] ^
- this.multiplication32(
- this.unsigned32(this.mt[i - 1] ^ (this.mt[i - 1] >>> 30)),
- 1566083941
- )
- ),
- i
- );
- //c//mt[i] &= 0xffffffff; /* for WORDSIZE > 32 machines */
- this.mt[i] = this.unsigned32(this.mt[i] & 0xffffffff);
- i++;
- if (i >= this.N) {
- this.mt[0] = this.mt[this.N - 1];
- i = 1;
- }
- }
- this.mt[0] = 0x80000000; /* MSB is 1; assuring non-zero initial array */
- }
-
- /* moved outside of genrand_int32() by jwatte 2010-11-17; generate less garbage */
- private mag01 = [0x0, this.MATRIX_A];
-
- /**
- * Generates a random number on [0,2^32]-interval
- */
- //c//unsigned long genrand_int32(void)
- genrandInt32(): number {
- //c//unsigned long y;
- //c//static unsigned long mag01[2]={0x0UL, MATRIX_A};
- let y: number;
- /* mag01[x] = x * MATRIX_A for x=0,1 */
-
- if (this.mti >= this.N) {
- /* generate N words at one time */
- //c//int kk;
- let kk: number;
-
- if (this.mti === this.N + 1) {
- /* if init_genrand() has not been called, */
- //c//init_genrand(5489); /* a default initial seed is used */
- this.initGenrand(5489);
- } /* a default initial seed is used */
-
- for (kk = 0; kk < this.N - this.M; kk++) {
- //c//y = (mt[kk]&UPPER_MASK)|(mt[kk+1]&LOWER_MASK);
- //c//mt[kk] = mt[kk+M] ^ (y >> 1) ^ mag01[y & 0x1];
- y = this.unsigned32(
- (this.mt[kk] & this.UPPER_MASK) | (this.mt[kk + 1] & this.LOWER_MASK)
- );
- this.mt[kk] = this.unsigned32(
- this.mt[kk + this.M] ^ (y >>> 1) ^ this.mag01[y & 0x1]
- );
- }
- for (; kk < this.N - 1; kk++) {
- //c//y = (mt[kk]&UPPER_MASK)|(mt[kk+1]&LOWER_MASK);
- //c//mt[kk] = mt[kk+(M-N)] ^ (y >> 1) ^ mag01[y & 0x1];
- y = this.unsigned32(
- (this.mt[kk] & this.UPPER_MASK) | (this.mt[kk + 1] & this.LOWER_MASK)
- );
- this.mt[kk] = this.unsigned32(
- this.mt[kk + (this.M - this.N)] ^ (y >>> 1) ^ this.mag01[y & 0x1]
- );
- }
- //c//y = (mt[N-1]&UPPER_MASK)|(mt[0]&LOWER_MASK);
- //c//mt[N-1] = mt[M-1] ^ (y >> 1) ^ mag01[y & 0x1];
- y = this.unsigned32(
- (this.mt[this.N - 1] & this.UPPER_MASK) | (this.mt[0] & this.LOWER_MASK)
- );
- this.mt[this.N - 1] = this.unsigned32(
- this.mt[this.M - 1] ^ (y >>> 1) ^ this.mag01[y & 0x1]
- );
- this.mti = 0;
- }
-
- y = this.mt[this.mti++];
-
- /* Tempering */
- //c//y ^= (y >> 11);
- //c//y ^= (y << 7) & 0x9d2c5680;
- //c//y ^= (y << 15) & 0xefc60000;
- //c//y ^= (y >> 18);
- y = this.unsigned32(y ^ (y >>> 11));
- y = this.unsigned32(y ^ ((y << 7) & 0x9d2c5680));
- y = this.unsigned32(y ^ ((y << 15) & 0xefc60000));
- y = this.unsigned32(y ^ (y >>> 18));
-
- return y;
- }
-
- /**
- * Generates a random number on [0,2^32]-interval
- */
- //c//long genrand_int31(void)
- genrandInt31(): number {
- //c//return (genrand_int32()>>1);
- return this.genrandInt32() >>> 1;
- }
-
- /**
- * Generates a random number on [0,1]-real-interval
- */
- //c//double genrand_real1(void)
- genrandReal1(): number {
- //c//return genrand_int32()*(1.0/4294967295.0);
- return this.genrandInt32() * (1.0 / 4294967295.0);
- /* divided by 2^32-1 */
- }
-
- /**
- * Generates a random number on [0,1)-real-interval
- */
- //c//double genrand_real2(void)
- genrandReal2(): number {
- //c//return genrand_int32()*(1.0/4294967296.0);
- return this.genrandInt32() * (1.0 / 4294967296.0);
- /* divided by 2^32 */
- }
-
- /**
- * Generates a random number on (0,1)-real-interval
- */
- //c//double genrand_real3(void)
- genrandReal3(): number {
- //c//return ((genrand_int32()) + 0.5)*(1.0/4294967296.0);
- return (this.genrandInt32() + 0.5) * (1.0 / 4294967296.0);
- /* divided by 2^32 */
- }
-
- /**
- * Generates a random number on [0,1) with 53-bit resolution
- */
- //c//double genrand_res53(void)
- genrandRes53(): number {
- //c//unsigned long a=genrand_int32()>>5, b=genrand_int32()>>6;
- const a = this.genrandInt32() >>> 5,
- b = this.genrandInt32() >>> 6;
- return (a * 67108864.0 + b) * (1.0 / 9007199254740992.0);
- }
- /* These real versions are due to Isaku Wada, 2002/01/09 added */
-}