39 private static final long serialVersionUID = 70510L;
44 private static final long m1 = 4294967087L;
45 private static final long m2 = 4294944443L;
46 private static final long a12 = 1403580L;
47 private static final long a13n = 810728L;
48 private static final long a21 = 527612L;
49 private static final long a23n = 1370589L;
50 private static final long two17 = 131072L;
51 private static final long two53 = 9007199254740992L;
52 private static final double invtwo24 = 5.9604644775390625e-8;
53 private static final double norm = 2.328306549295727688e-10;
63 private static final long A1p0[][] = { { 0L, 1L, 0L }, { 0L, 0L, 1L }, { -810728L, 1403580L, 0L } };
64 private static final long A2p0[][] = { { 0L, 1L, 0L }, { 0L, 0L, 1L }, { -1370589L, 0L, 527612L } };
65 private static final long A1p76[][] = { { 82758667L, 1871391091L, 4127413238L },
66 { 3672831523L, 69195019L, 1871391091L }, { 3672091415L, 3528743235L, 69195019L } };
67 private static final long A2p76[][] = { { 1511326704L, 3759209742L, 1610795712L },
68 { 4292754251L, 1511326704L, 3889917532L }, { 3859662829L, 4292754251L, 3708466080L } };
69 private static final long A1p127[][] = { { 2427906178L, 3580155704L, 949770784L },
70 { 226153695L, 1230515664L, 3580155704L }, { 1988835001L, 986791581L, 1230515664L } };
71 private static final long A2p127[][] = { { 1464411153L, 277697599L, 1610723613L },
72 { 32183930L, 1464411153L, 1022607788L }, { 2824425944L, 32183930L, 2093834863L } };
77 private static long nextSeed[] = { 12345, 12345, 12345, 12345, 12345, 12345 };
78 private long Cg0, Cg1, Cg2, Cg3, Cg4, Cg5;
79 private long Bg[] =
new long[6];
80 private long Ig[] =
new long[6];
87 private static void multMatVect(
long[] v,
long[][] A,
long m1,
long[][] B,
long m2) {
88 long[] vv =
new long[3];
89 for (
int i = 0; i < 3; i++)
92 for (
int i = 0; i < 3; i++)
95 for (
int i = 0; i < 3; i++)
98 for (
int i = 0; i < 3; i++)
106 for (
int i = 0; i < 6; i++)
109 multMatVect(nextSeed, A1p127, m1, A2p127, m2);
112 public MRG32k3aL(String name) {
125 for (
int i = 0; i < 6; ++i)
126 nextSeed[i] = seed[i];
135 for (
int i = 0; i < 6; ++i)
145 for (
int i = 0; i < 6; ++i)
160 multMatVect(Bg, A1p76, m1, A2p76, m2);
164 public long[] getState() {
165 return new long[] { Cg0, Cg1, Cg2, Cg3, Cg4, Cg5 };
174 str.
append(
"The current state of the MRG32k3aL");
175 if (name !=
null && name.length() > 0)
193 str.
append(
"The MRG32k3aL stream");
194 if (name !=
null && name.length() > 0)
200 for (
int i = 0; i < 5; i++)
205 for (
int i = 0; i < 5; i++)
224 MRG32k3aL retour =
null;
226 retour = (MRG32k3aL) super.
clone();
227 retour.Bg =
new long[6];
228 retour.Ig =
new long[6];
229 for (
int i = 0; i < 6; i++) {
230 retour.Bg[i] = Bg[i];
231 retour.Ig[i] = Ig[i];
245 p1 = (a12 * Cg1 - a13n * Cg0) % m1;
253 p2 = (a21 * Cg5 - a23n * Cg3) % m2;
261 return (
double) ((p1 > p2) ? (p1 - p2) * norm : (p1 - p2 + m1) * norm);
264 private static void validateSeed(
long seed[]) {
266 throw new IllegalArgumentException(
"Seed must contain 6 values");
267 if (seed[0] == 0 && seed[1] == 0 && seed[2] == 0)
268 throw new IllegalArgumentException(
"The first 3 values must not be 0");
269 if (seed[3] == 0 && seed[4] == 0 && seed[5] == 0)
270 throw new IllegalArgumentException(
"The last 3 values must not be 0");
271 final long m1 = 4294967087L;
272 if (seed[0] >= m1 || seed[1] >= m1 || seed[2] >= m1)
273 throw new IllegalArgumentException(
"The first 3 values must be less than " + m1);
274 final long m2 = 4294944443L;
275 if (seed[3] >= m2 || seed[4] >= m2 || seed[5] >= m2)
276 throw new IllegalArgumentException(
"The last 3 values must be less than " + m2);