1
2
3
4
5
6 package io.github.olyutorskii.aletojio.rng.lcg;
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41 public final class LcgFactory {
42
43 private static final long RANDU_MUL = 65539L;
44 private static final long RANDU_INC = 0L;
45 private static final long RANDU_MOD = 2147483648L;
46
47 private static final long MINSTD0_MUL = 16807L;
48
49 private static final long MINSTD_MUL = 48271L;
50 private static final long MINSTD_INC = 0L;
51 private static final long MINSTD_MOD = 2147483647L;
52
53 private static final long GLIBC_MUL = 1103515245L;
54 private static final long GLIBC_INC = 12345L;
55 private static final long GLIBC_MOD = 2147483648L;
56
57 private static final long MRAND48_MUL = 25214903917L;
58 private static final long MRAND48_INC = 11L;
59 private static final long MRAND48_MOD = 281474976710656L;
60
61 private static final long RANDU_INITSEED = 1L;
62 private static final long MINSTD_INITSEED = 1L;
63 private static final long GLIBC_INITSEED = 1L;
64 private static final long MRAND48_INITSEED = 20017429951246L;
65
66 private static final long MRAND48_MASK = MRAND48_MOD - 1L;
67
68 static {
69 assert RANDU_MUL == 0x00010003L;
70 assert MINSTD0_MUL == 0x000041a7L;
71 assert MINSTD_MUL == 0x0000bc8fL;
72 assert GLIBC_MUL == 0x41c64e6dL;
73 assert MRAND48_MUL == 0x05deece66dL;
74
75 assert MRAND48_INITSEED == 0x1234abcd330eL;
76
77 assert MRAND48_MASK == 0xffff_ffff_ffffL;
78
79 new LcgFactory().hashCode();
80 }
81
82
83
84
85
86 private LcgFactory() {
87 }
88
89
90
91
92
93
94
95
96
97
98
99
100 public static LcgRndInt31 createRandu() {
101 LcgRndInt31 result;
102 result = new LcgRndInt31(RANDU_MUL, RANDU_INC, RANDU_MOD);
103 result.setSeed(RANDU_INITSEED);
104 return result;
105 }
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121 public static LcgRndInt31 createMinStd0() {
122 LcgRndInt31 result;
123 result = new LcgRndInt31(MINSTD0_MUL, MINSTD_INC, MINSTD_MOD);
124 result.setSeed(MINSTD_INITSEED);
125 return result;
126 }
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142 public static LcgRndInt31 createMinStd() {
143 LcgRndInt31 result;
144 result = new LcgRndInt31(MINSTD_MUL, MINSTD_INC, MINSTD_MOD);
145 result.setSeed(MINSTD_INITSEED);
146 return result;
147 }
148
149
150
151
152
153
154
155
156
157
158 public static LcgRndInt31 createGlibc() {
159 LcgRndInt31 result;
160 result = new LcgRndInt31(GLIBC_MUL, GLIBC_INC, GLIBC_MOD);
161 result.setSeed(GLIBC_INITSEED);
162 return result;
163 }
164
165
166
167
168
169
170
171
172
173
174
175 public static LcgRndInt31 createLrand48() {
176 LcgRndInt31 result;
177 result = new LcgRndInt31(MRAND48_MUL, MRAND48_INC, MRAND48_MOD) {
178 @Override
179 protected int seedToResult() {
180 long lVal = getSeed() >>> 17;
181 lVal &= MASK_B31;
182 int result = (int) lVal;
183 return result;
184 }
185 };
186
187 result.setSeed(MRAND48_INITSEED);
188 return result;
189 }
190
191
192
193
194
195
196
197
198
199
200 public static LcgRndInt32 createMrand48() {
201 LcgRndInt32 result;
202 result = new LcgRndInt32(MRAND48_MUL, MRAND48_INC, MRAND48_MOD);
203 result.setSeed(MRAND48_INITSEED);
204 return result;
205 }
206
207
208
209
210
211
212
213
214
215
216
217 public static long seedScrambler4M48(long seedArg) {
218 long result = (seedArg ^ MRAND48_MUL) & MRAND48_MASK;
219 return result;
220 }
221
222 }