1
2 //
3 // This source file is part of appleseed.
4 // Visit https://appleseedhq.net/ for additional information and resources.
5 //
6 // This software is released under the MIT license.
7 //
8 // Copyright (c) 2010-2013 Francois Beaune, Jupiter Jazz Limited
9 // Copyright (c) 2014-2018 Francois Beaune, The appleseedhq Organization
10 //
11 // Permission is hereby granted, free of charge, to any person obtaining a copy
12 // of this software and associated documentation files (the "Software"), to deal
13 // in the Software without restriction, including without limitation the rights
14 // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
15 // copies of the Software, and to permit persons to whom the Software is
16 // furnished to do so, subject to the following conditions:
17 //
18 // The above copyright notice and this permission notice shall be included in
19 // all copies or substantial portions of the Software.
20 //
21 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
22 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
23 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
24 // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
25 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
26 // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
27 // THE SOFTWARE.
28 //
29
30 // appleseed.foundation headers.
31 #include "foundation/math/rng/distribution.h"
32 #include "foundation/math/rng/pcg.h"
33 #include "foundation/math/rng/serialmersennetwister.h"
34 #ifdef APPLESEED_USE_SSE
35 #include "foundation/math/rng/simdmersennetwister.h"
36 #endif
37 #include "foundation/platform/types.h"
38 #include "foundation/utility/countof.h"
39 #include "foundation/utility/test.h"
40
41 // Standard headers.
42 #include <cstddef>
43 #include <limits>
44
45 using namespace foundation;
46 using namespace std;
47
TEST_SUITE(Foundation_Math_RNG)48 TEST_SUITE(Foundation_Math_RNG)
49 {
50 struct FakeRNG
51 {
52 const uint32 m_value;
53
54 explicit FakeRNG(const uint32 value)
55 : m_value(value)
56 {
57 }
58
59 uint32 rand_uint32() const
60 {
61 return m_value;
62 }
63 };
64
65 //
66 // rand_float31()
67 //
68
69 TEST_CASE(RandInt31_Given0x00000000_ReturnsZero)
70 {
71 FakeRNG rng(0x00000000);
72
73 const int32 value = rand_int31(rng);
74
75 EXPECT_EQ(0, value);
76 }
77
78 TEST_CASE(RandInt31_Given0xFFFFFFFF_ReturnsZero)
79 {
80 FakeRNG rng(0xFFFFFFFF);
81
82 const int32 value = rand_int31(rng);
83
84 EXPECT_EQ(0x7FFFFFFF, value);
85 }
86
87 //
88 // rand_int1()
89 //
90
91 TEST_CASE(RandInt1_Given0x00000000_ReturnsLowBound)
92 {
93 FakeRNG rng(0x00000000);
94
95 const int32 value = rand_int1(rng, -12, 42);
96
97 EXPECT_EQ(-12, value);
98 }
99
100 TEST_CASE(RandInt1_Given0xFFFFFFFF_ReturnsHighBound)
101 {
102 FakeRNG rng(0xFFFFFFFF);
103
104 const int32 value = rand_int1(rng, -12, 42);
105
106 EXPECT_EQ(42, value);
107 }
108
109 //
110 // rand_float1()
111 //
112
113 TEST_CASE(RandFloat1_Given0x00000000_ReturnsZero)
114 {
115 FakeRNG rng(0x00000000);
116
117 const float value = rand_float1(rng);
118
119 EXPECT_EQ(0.0f, value);
120 }
121
122 TEST_CASE(RandFloat1_Given0xFFFFFFFF_ReturnsOne)
123 {
124 FakeRNG rng(0xFFFFFFFF);
125
126 const float value = rand_float1(rng);
127
128 EXPECT_EQ(1.0f, value);
129 }
130
131 TEST_CASE(RandFloat1_Given0x00000000_ReturnsLowBound)
132 {
133 FakeRNG rng(0x00000000);
134
135 const float value = rand_float1(rng, -12.0f, 42.0f);
136
137 EXPECT_EQ(-12.0f, value);
138 }
139
140 TEST_CASE(RandFloat1_Given0xFFFFFFFF_ReturnsHighBound)
141 {
142 FakeRNG rng(0xFFFFFFFF);
143
144 const float value = rand_float1(rng, -12.0f, 42.0f);
145
146 EXPECT_EQ(42.0f, value);
147 }
148
149 //
150 // rand_double1()
151 //
152
153 TEST_CASE(RandDouble1_Given0x00000000_ReturnsZero)
154 {
155 FakeRNG rng(0x00000000);
156
157 const double value = rand_double1(rng);
158
159 EXPECT_EQ(0.0, value);
160 }
161
162 TEST_CASE(RandDouble1_Given0xFFFFFFFF_ReturnsOne)
163 {
164 FakeRNG rng(0xFFFFFFFF);
165
166 const double value = rand_double1(rng);
167
168 EXPECT_EQ(1.0, value);
169 }
170
171 TEST_CASE(RandDouble1_Given0x00000000_ReturnsLowBound)
172 {
173 FakeRNG rng(0x00000000);
174
175 const double value = rand_double1(rng, -12.0, 42.0);
176
177 EXPECT_EQ(-12.0, value);
178 }
179
180 TEST_CASE(RandDouble1_Given0xFFFFFFFF_ReturnsHighBound)
181 {
182 FakeRNG rng(0xFFFFFFFF);
183
184 const double value = rand_double1(rng, -12.0, 42.0);
185
186 EXPECT_EQ(42.0, value);
187 }
188
189 //
190 // rand_float2()
191 //
192
193 TEST_CASE(RandFloat2_Given0x00000000_ReturnsZero)
194 {
195 FakeRNG rng(0x00000000);
196
197 const float value = rand_float2(rng);
198
199 EXPECT_EQ(0.0f, value);
200 }
201
202 TEST_CASE(RandFloat2_Given0xFFFFFFFF_ReturnsAlmostOne)
203 {
204 FakeRNG rng(0xFFFFFFFF);
205
206 const float value = rand_float2(rng);
207
208 EXPECT_LT(1.0f, value);
209 }
210
211 TEST_CASE(RandFloat2_Given0x00000000_ReturnsLowBound)
212 {
213 FakeRNG rng(0x00000000);
214
215 const float value = rand_float2(rng, -12.0f, 42.0f);
216
217 EXPECT_EQ(-12.0f, value);
218 }
219
220 TEST_CASE(RandFloat2_Given0xFFFFFFFF_ReturnsAlmostHighBound)
221 {
222 FakeRNG rng(0xFFFFFFFF);
223
224 const float value = rand_float2(rng, -12.0f, 42.0f);
225
226 EXPECT_LT(42.0f, value);
227 }
228
229 //
230 // rand_double2()
231 //
232
233 TEST_CASE(RandDouble2_Given0x00000000_ReturnsZero)
234 {
235 FakeRNG rng(0x00000000);
236
237 const double value = rand_double2(rng);
238
239 EXPECT_EQ(0.0, value);
240 }
241
242 TEST_CASE(RandDouble2_Given0xFFFFFFFF_ReturnsAlmostOne)
243 {
244 FakeRNG rng(0xFFFFFFFF);
245
246 const double value = rand_double2(rng);
247
248 EXPECT_LT(1.0, value);
249 }
250
251 TEST_CASE(RandDouble2_Given0x00000000_ReturnsLowBound)
252 {
253 FakeRNG rng(0x00000000);
254
255 const double value = rand_double2(rng, -12.0, 42.0);
256
257 EXPECT_EQ(-12.0, value);
258 }
259
260 TEST_CASE(RandDouble2_Given0xFFFFFFFF_ReturnsAlmostHighBound)
261 {
262 FakeRNG rng(0xFFFFFFFF);
263
264 const double value = rand_double2(rng, -12.0, 42.0);
265
266 EXPECT_LT(42.0, value);
267 }
268
269 //
270 // rand_float3()
271 //
272
273 TEST_CASE(RandFloat3_Given0x00000000_ReturnsAlmostZero)
274 {
275 FakeRNG rng(0x00000000);
276
277 const float value = rand_float3(rng);
278
279 EXPECT_EQ(numeric_limits<float>::epsilon(), value);
280 }
281
282 TEST_CASE(RandFloat3_Given0xFFFFFFFF_ReturnsAlmostOne)
283 {
284 FakeRNG rng(0xFFFFFFFF);
285
286 const float value = rand_float3(rng);
287
288 EXPECT_LT(1.0f, value);
289 }
290
291 TEST_CASE(RandFloat3_Given0x00000000_ReturnsAlmostLowBound)
292 {
293 FakeRNG rng(0x00000000);
294
295 const float value = rand_float3(rng, -12.0f, 42.0f);
296
297 EXPECT_GT(-12.0f, value);
298 }
299
300 TEST_CASE(RandFloat3_Given0xFFFFFFFF_ReturnsAlmostHighBound)
301 {
302 FakeRNG rng(0xFFFFFFFF);
303
304 const float value = rand_float3(rng, -12.0f, 42.0f);
305
306 EXPECT_LT(42.0f, value);
307 }
308
309 //
310 // rand_double3()
311 //
312
313 TEST_CASE(RandDouble3_Given0x00000000_ReturnsAlmostZero)
314 {
315 FakeRNG rng(0x00000000);
316
317 const double value = rand_double3(rng);
318
319 EXPECT_EQ(numeric_limits<double>::epsilon(), value);
320 }
321
322 TEST_CASE(RandDouble3_Given0xFFFFFFFF_ReturnsAlmostOne)
323 {
324 FakeRNG rng(0xFFFFFFFF);
325
326 const double value = rand_double3(rng);
327
328 EXPECT_LT(1.0, value);
329 }
330
331 TEST_CASE(RandDouble3_Given0x00000000_ReturnsAlmostLowBound)
332 {
333 FakeRNG rng(0x00000000);
334
335 const double value = rand_double3(rng, -12.0, 42.0);
336
337 EXPECT_GT(-12.0, value);
338 }
339
340 TEST_CASE(RandDouble3_Given0xFFFFFFFF_ReturnsAlmostHighBound)
341 {
342 FakeRNG rng(0xFFFFFFFF);
343
344 const double value = rand_double3(rng, -12.0, 42.0);
345
346 EXPECT_LT(42.0, value);
347 }
348 }
349
TEST_SUITE(Foundation_Math_RNG_PCG)350 TEST_SUITE(Foundation_Math_RNG_PCG)
351 {
352 TEST_CASE(CheckFirstValues)
353 {
354 static const uint32 Expected[1000] =
355 {
356 465482994u, 3895364073u, 1746730475u, 3759121132u, 2984354868u,
357 3193308813u, 719162516u, 2669372405u, 952099657u, 3848281661u,
358 1722616740u, 1703410327u, 1489898431u, 2808816474u, 3394935963u,
359 3800733979u, 2645780359u, 54025654u, 1620520937u, 261133231u,
360 1030578764u, 807022259u, 1409000050u, 1194629604u, 3777309333u,
361 1570294272u, 2649937232u, 857373089u, 3598020669u, 1775738823u,
362 3466178238u, 3827724402u, 3892889888u, 1220604704u, 2032491117u,
363 1023053890u, 1431308669u, 1548609434u, 2152671001u, 1671576757u,
364 2157114852u, 3164731816u, 3064050002u, 3933235971u, 3685010053u,
365 244697458u, 1057877727u, 3913827785u, 4040586935u, 2952457164u,
366 1755638421u, 318176490u, 141439085u, 278066646u, 6216125u,
367 4112216801u, 2153261903u, 3492890592u, 1475026070u, 2855248709u,
368 3560663111u, 969631411u, 3597755749u, 1322751635u, 789892014u,
369 4121396030u, 733563246u, 1824419711u, 3970343011u, 4009937121u,
370 2637784390u, 32991992u, 3020205058u, 1006006050u, 3127840334u,
371 4188188064u, 4009056852u, 1465278880u, 3249233677u, 3753806003u,
372 664373599u, 1508096799u, 3394681943u, 62071327u, 915232454u,
373 1625211000u, 2684613559u, 2922282686u, 4288936899u, 1423863364u,
374 134946067u, 3289865634u, 3155765718u, 3091845294u, 3822057133u,
375 1131131786u, 4248055303u, 1322921553u, 1176461978u, 3293688225u,
376 3787014237u, 2765630495u, 1433364517u, 3592567205u, 3283449589u,
377 109306324u, 656271382u, 3582449353u, 4161900925u, 185344389u,
378 1769123328u, 3346114032u, 3122320552u, 4004922408u, 1808396717u,
379 3272400844u, 1961384329u, 1444279534u, 709737294u, 2786215081u,
380 4098000533u, 629269910u, 4155652252u, 2656899968u, 881889592u,
381 3063710254u, 3323945442u, 2741690169u, 2297777418u, 4108736600u,
382 3943244610u, 1147605934u, 1468227652u, 4022701806u, 1151190667u,
383 972758586u, 1054835633u, 3707114440u, 1907540675u, 324914788u,
384 136492079u, 1705660957u, 2427770070u, 3320260920u, 3436422337u,
385 2279229591u, 3745952773u, 1807062016u, 225624947u, 35839144u,
386 897450126u, 2105937723u, 2744800013u, 1344862690u, 3403500186u,
387 4234886781u, 2658206965u, 1330997185u, 1824411582u, 3983431514u,
388 761882792u, 3710709211u, 1813117973u, 3212297677u, 487384258u,
389 2769630333u, 3682106941u, 2452362071u, 340332599u, 3811708210u,
390 4206963802u, 1765960700u, 207478359u, 1260718904u, 4024503564u,
391 2206499484u, 1566084957u, 3810787984u, 4045246547u, 1480492094u,
392 2944768776u, 361929548u, 169936580u, 378736854u, 2242206212u,
393 2441305762u, 2980803926u, 15346626u, 1963614569u, 2826471979u,
394 2651250669u, 2274522419u, 3468838334u, 1610833910u, 688143972u,
395 2293884033u, 4194680318u, 1169533019u, 3046836575u, 2845509538u,
396 823063969u, 2076652351u, 1722229730u, 3076908003u, 2319117894u,
397 835368201u, 406233054u, 4057401169u, 2270372618u, 3917055080u,
398 1460755795u, 242522141u, 94961104u, 3179588930u, 1263719626u,
399 27593365u, 3160785324u, 1801678587u, 1082312349u, 3140015414u,
400 3012359102u, 1541796750u, 491812712u, 1639334942u, 287594015u,
401 2561866516u, 3426519515u, 2055710930u, 85266343u, 2927118831u,
402 1007103242u, 455390501u, 2044299186u, 1218549315u, 3936522396u,
403 620543335u, 4127124522u, 3135565957u, 1162143357u, 405145806u,
404 675370757u, 3896852661u, 157894814u, 1704790987u, 3749626014u,
405 3519620942u, 3673387278u, 109600806u, 4230191316u, 3534396608u,
406 4101197030u, 3558881806u, 3857954642u, 2934155368u, 1012750537u,
407 514464335u, 3231749283u, 2224884628u, 2124276068u, 1692532105u,
408 2362044988u, 2770212179u, 2528157601u, 1871752329u, 1040103142u,
409 921873856u, 3089955944u, 1619538362u, 3187911481u, 4261785566u,
410 4166980944u, 3536638714u, 2461152277u, 1632778664u, 770986155u,
411 4116686745u, 319400687u, 3798220876u, 3866317149u, 1346665939u,
412 2966603107u, 1687366206u, 2880701602u, 19312777u, 3672408015u,
413 3448917902u, 3542853962u, 1294299952u, 2545503747u, 3265271752u,
414 1872634441u, 3641405213u, 1282087244u, 393803443u, 3131983704u,
415 4235508104u, 2420149709u, 3241080269u, 1024941664u, 3897951431u,
416 3548023647u, 1855080529u, 3104816674u, 2649935374u, 564606414u,
417 2162697020u, 3697205864u, 4245419098u, 3316305136u, 686505901u,
418 716199242u, 2658887046u, 1840279374u, 3176513445u, 2827929902u,
419 4278579186u, 1610895615u, 1304868922u, 1605797922u, 1274808765u,
420 1458924666u, 4194557538u, 830890550u, 3555200470u, 4120209723u,
421 1378923252u, 3990108779u, 4000921909u, 1273260362u, 639215459u,
422 1551239150u, 498502528u, 3449454753u, 3657050436u, 3480834160u,
423 1226782798u, 4225298341u, 4205157369u, 733984732u, 1455010350u,
424 2792318597u, 4155647965u, 438108875u, 2879456526u, 2012042651u,
425 3734652999u, 4209825478u, 4225277434u, 3415267156u, 1580129051u,
426 3752110012u, 3533790893u, 1803153174u, 828152287u, 1474117358u,
427 256101288u, 3757978419u, 2776305617u, 1990418697u, 800663818u,
428 2790290134u, 2772921656u, 3059333829u, 1088967793u, 3086204801u,
429 344889773u, 220675221u, 1832222395u, 2651847300u, 1188093205u,
430 2482162678u, 2968175843u, 3993601096u, 3382918351u, 3435872864u,
431 1713943075u, 185520214u, 904130304u, 2156277605u, 2889862920u,
432 3264857306u, 3771715412u, 1768245395u, 4221013668u, 872636844u,
433 954019771u, 189417071u, 2096666402u, 353803945u, 3307302226u,
434 3406269772u, 3839409977u, 1519839804u, 3165110681u, 1220956337u,
435 1902108067u, 3657394395u, 805183825u, 3604333206u, 571692744u,
436 2673761298u, 2261563553u, 230382783u, 356025636u, 1820146399u,
437 134212230u, 3300287472u, 259268156u, 2968352124u, 3021994189u,
438 1224916309u, 1291216671u, 3001213195u, 3288470723u, 2746354006u,
439 1502434053u, 1055034431u, 3874403205u, 4244208493u, 520862961u,
440 51348858u, 676958606u, 1473033635u, 3388165397u, 1517361556u,
441 1825462694u, 316109372u, 4069103744u, 3070696905u, 65715771u,
442 3983605689u, 2924360096u, 1170124386u, 1450222948u, 20691102u,
443 1826512271u, 4008735827u, 2299258579u, 3548681686u, 1363998507u,
444 1951895778u, 2146832550u, 1816438814u, 2021234720u, 2962405652u,
445 342110737u, 647391137u, 3226139671u, 2408513992u, 732560501u,
446 696590447u, 4072620348u, 3065013001u, 952094047u, 394559597u,
447 1269779113u, 3185474057u, 4048567556u, 2484039105u, 1777541032u,
448 3866851064u, 2406122807u, 1516539538u, 1073471295u, 2786063658u,
449 89688024u, 677739817u, 1895047365u, 3597770376u, 728134790u,
450 4107741178u, 3034023269u, 2399538448u, 3391070040u, 2378581799u,
451 661872886u, 3319839853u, 2004303756u, 1172539869u, 3560129569u,
452 3598079215u, 1225584608u, 3303541072u, 762740397u, 130900830u,
453 1327299177u, 2275893453u, 3774271512u, 4085797628u, 3755723537u,
454 2486252554u, 72329892u, 3732893045u, 3165583721u, 729562343u,
455 313762021u, 2996786180u, 3494355648u, 2935020612u, 2410703511u,
456 1531022709u, 2604571214u, 1226502258u, 4136095834u, 3255219349u,
457 2860486741u, 3688367851u, 3989775160u, 858953727u, 3641777467u,
458 3549698342u, 1135218900u, 3202256767u, 337312587u, 3991884271u,
459 694582815u, 2551923159u, 1553729687u, 546250406u, 1951752819u,
460 1882094838u, 2036813231u, 2549760418u, 2573075839u, 2531696804u,
461 68044944u, 3665444721u, 3240941724u, 1630534563u, 1334014888u,
462 2704482861u, 3928686790u, 3369866204u, 986729554u, 1034478917u,
463 393391616u, 1951442357u, 3471529857u, 144768560u, 1344157423u,
464 786938876u, 1283190813u, 3927248310u, 251402307u, 104337042u,
465 544930794u, 2217267062u, 381987884u, 2594076005u, 2279833553u,
466 701826400u, 1311965289u, 1550005519u, 3364153542u, 3642781015u,
467 289358471u, 3172008619u, 958913485u, 2041175232u, 1905770175u,
468 972497295u, 3455023600u, 3329478837u, 397931201u, 1085663116u,
469 1687329263u, 4290267250u, 2020782527u, 2325611860u, 4242873789u,
470 166431405u, 1809941918u, 3863545693u, 684654678u, 3059190685u,
471 3208436780u, 3554042095u, 1153254596u, 2640150859u, 3197741756u,
472 3028944694u, 549767750u, 1782272849u, 1835840141u, 1180449948u,
473 3072163297u, 3758104312u, 964613542u, 3891113402u, 1697646599u,
474 3168911866u, 2820170424u, 3809415428u, 1942956328u, 1388394571u,
475 3628288751u, 805257098u, 3510090550u, 1049540951u, 1407344946u,
476 873816181u, 3817081998u, 1438820300u, 2344750697u, 2690407112u,
477 2531608377u, 1120902377u, 4202049126u, 3161964145u, 3299462121u,
478 3362451470u, 1189824564u, 3958710760u, 3734303124u, 3387546887u,
479 3613276700u, 3875598669u, 128023276u, 4245422123u, 4221105503u,
480 2018960709u, 2856792473u, 4229384364u, 2777208963u, 4069470800u,
481 3921081162u, 3395673425u, 3980316461u, 3223362011u, 2365296896u,
482 3736441138u, 2057088382u, 1600132689u, 3374787265u, 3678862805u,
483 1068992299u, 517843887u, 837323610u, 859617217u, 1221791314u,
484 3969753797u, 3799532205u, 106653029u, 970895481u, 1381363678u,
485 2300178826u, 758150813u, 3640290888u, 2313233378u, 3004982916u,
486 2399287351u, 426741654u, 2119962257u, 2045433685u, 3479319578u,
487 1157098845u, 1832569724u, 3238341637u, 3244682063u, 311114365u,
488 3807196971u, 2949091294u, 171208131u, 4045114636u, 2199577423u,
489 3803939771u, 4247235617u, 2994251157u, 4181075830u, 1471125670u,
490 3542471468u, 1287379416u, 1594301128u, 668571501u, 2053765498u,
491 3215020519u, 2474077257u, 692086859u, 3061837168u, 1312128685u,
492 1645287161u, 809331763u, 167286374u, 1673084553u, 2703753573u,
493 3969485877u, 1080709807u, 3567096593u, 846330823u, 3980732819u,
494 3927110949u, 899211926u, 1446293957u, 1745452116u, 689646794u,
495 547777106u, 3396984022u, 2010604395u, 2157645177u, 182647459u,
496 1817251360u, 2483516668u, 1995873889u, 440809281u, 4182207809u,
497 2473922628u, 3573437277u, 3932825655u, 694941001u, 1297210299u,
498 2878018727u, 983045991u, 2979766881u, 3824708038u, 1893046144u,
499 2950260501u, 3369875908u, 3948835952u, 2410606667u, 1924300086u,
500 2323635649u, 1095692796u, 3215651702u, 3165206374u, 2035971927u,
501 3211187285u, 3573977418u, 3022182967u, 4241902055u, 2685286596u,
502 2409689870u, 389933430u, 1876139085u, 2035379173u, 3156719403u,
503 850616459u, 1100758070u, 3259255264u, 642558827u, 3060970603u,
504 39762863u, 2896966783u, 3841349437u, 3927325558u, 3446746799u,
505 3092460994u, 3462533949u, 2715100372u, 3600592348u, 1438119909u,
506 3389886536u, 206032886u, 3423871741u, 318745766u, 3022551890u,
507 698159530u, 26595453u, 1018694439u, 3487920415u, 836133134u,
508 2555459386u, 13376211u, 2974935778u, 3923982110u, 4128440368u,
509 3151290570u, 2700878630u, 349544893u, 4254434606u, 620702738u,
510 4184546648u, 95330427u, 3685257541u, 616906128u, 4096039593u,
511 181324388u, 213326528u, 2483036287u, 3687447591u, 3082481181u,
512 2804751679u, 2757863992u, 3336203251u, 2426966656u, 1857597291u,
513 1898028617u, 2297843497u, 3115799206u, 3384611758u, 3149613215u,
514 3532453271u, 3292199609u, 3014987086u, 3072689674u, 4081358502u,
515 361834883u, 2049312339u, 153039032u, 4193383831u, 3558002292u,
516 3582826727u, 777972122u, 641638048u, 285854978u, 723222147u,
517 2950756410u, 3666770147u, 19541310u, 2944503394u, 2528939963u,
518 3911995283u, 4269641626u, 1854366031u, 4023317792u, 2401508969u,
519 1502161369u, 484087251u, 1653537256u, 3678756915u, 4180845982u,
520 2218674942u, 3883468233u, 119533952u, 3121053955u, 532580930u,
521 3344794900u, 1214377745u, 4020472257u, 2795807929u, 1420711044u,
522 3056222270u, 2578801852u, 1932552039u, 1565222480u, 102525319u,
523 1597046752u, 4191271569u, 1858141209u, 837013685u, 2433747334u,
524 801945982u, 959060361u, 3900212575u, 2614238724u, 2356097379u,
525 579520410u, 3592746657u, 624064611u, 40551695u, 1440244754u,
526 3451319299u, 1812727217u, 3063257791u, 1926605515u, 1333275492u,
527 286856518u, 2413498277u, 4017416493u, 1800948455u, 2260693661u,
528 2290564658u, 1434784375u, 2488451111u, 3192152375u, 2168945383u,
529 1162230581u, 3014021816u, 3221872028u, 3659578390u, 1777278318u,
530 1977967819u, 861294495u, 982368228u, 3857925954u, 3574400u,
531 2837466924u, 2403789615u, 489421197u, 2070340707u, 763511159u,
532 3093034739u, 564081942u, 3790255635u, 1851767311u, 215873064u,
533 2052885245u, 2188510630u, 1500502100u, 766582603u, 3510695729u,
534 3633897886u, 869534498u, 1753831571u, 4016802839u, 102915759u,
535 12219597u, 1903866871u, 2275773607u, 2562346680u, 3770683037u,
536 1757390667u, 2600644269u, 1836138610u, 2313159592u, 1176659651u,
537 1966051476u, 658762759u, 4017777180u, 1200918979u, 3547097818u,
538 1177471069u, 1587351568u, 3415751286u, 3964330266u, 2359113833u,
539 2568821952u, 1336884270u, 836456074u, 2166701280u, 1160828307u,
540 750251393u, 3797918310u, 3998220478u, 1541638959u, 1591470391u,
541 1284682287u, 1247297436u, 2244893425u, 3873319763u, 3209360521u,
542 1500760917u, 2824663904u, 387290747u, 1992384214u, 1503258234u,
543 2015988350u, 2401435878u, 1413123241u, 3447743383u, 4049325490u,
544 3351168044u, 4248822006u, 2111054222u, 299039262u, 4177777010u,
545 1907627089u, 1939937892u, 1225250402u, 718851315u, 2395397275u,
546 2505238660u, 1120665392u, 3625074646u, 3532710481u, 960090563u,
547 881896894u, 1380412530u, 2462191171u, 517723038u, 3641372153u,
548 1203216216u, 890039786u, 3681684286u, 2878010655u, 451644272u,
549 1878599910u, 2022851471u, 3846368475u, 4023462736u, 863533372u,
550 228470501u, 3978931801u, 326864213u, 712089245u, 145342046u,
551 1324459232u, 2723749020u, 3453504904u, 4239990007u, 1030934328u,
552 3132636380u, 599986453u, 210086237u, 650681824u, 2905813400u,
553 2016125599u, 3120916045u, 1939318307u, 1672297945u, 1645598494u,
554 2294474646u, 3039133078u, 1423739948u, 2636124712u, 1636318941u,
555 3339854250u, 1005852513u, 663467913u, 3883529571u, 1694069266u
556 };
557
558 PCG rng;
559
560 for (size_t i = 0; i < 1000; ++i)
561 EXPECT_EQ(Expected[i], rng.rand_uint32());
562 }
563 }
564
TEST_SUITE(Foundation_Math_RNG_SerialMersenneTwister)565 TEST_SUITE(Foundation_Math_RNG_SerialMersenneTwister)
566 {
567 TEST_CASE(CheckThousandFirstOutputValues)
568 {
569 static const uint32 Expected[1000] =
570 {
571 1067595299u, 955945823u, 477289528u, 4107218783u, 4228976476u,
572 3344332714u, 3355579695u, 227628506u, 810200273u, 2591290167u,
573 2560260675u, 3242736208u, 646746669u, 1479517882u, 4245472273u,
574 1143372638u, 3863670494u, 3221021970u, 1773610557u, 1138697238u,
575 1421897700u, 1269916527u, 2859934041u, 1764463362u, 3874892047u,
576 3965319921u, 72549643u, 2383988930u, 2600218693u, 3237492380u,
577 2792901476u, 725331109u, 605841842u, 271258942u, 715137098u,
578 3297999536u, 1322965544u, 4229579109u, 1395091102u, 3735697720u,
579 2101727825u, 3730287744u, 2950434330u, 1661921839u, 2895579582u,
580 2370511479u, 1004092106u, 2247096681u, 2111242379u, 3237345263u,
581 4082424759u, 219785033u, 2454039889u, 3709582971u, 835606218u,
582 2411949883u, 2735205030u, 756421180u, 2175209704u, 1873865952u,
583 2762534237u, 4161807854u, 3351099340u, 181129879u, 3269891896u,
584 776029799u, 2218161979u, 3001745796u, 1866825872u, 2133627728u,
585 34862734u, 1191934573u, 3102311354u, 2916517763u, 1012402762u,
586 2184831317u, 4257399449u, 2899497138u, 3818095062u, 3030756734u,
587 1282161629u, 420003642u, 2326421477u, 2741455717u, 1278020671u,
588 3744179621u, 271777016u, 2626330018u, 2560563991u, 3055977700u,
589 4233527566u, 1228397661u, 3595579322u, 1077915006u, 2395931898u,
590 1851927286u, 3013683506u, 1999971931u, 3006888962u, 1049781534u,
591 1488758959u, 3491776230u, 104418065u, 2448267297u, 3075614115u,
592 3872332600u, 891912190u, 3936547759u, 2269180963u, 2633455084u,
593 1047636807u, 2604612377u, 2709305729u, 1952216715u, 207593580u,
594 2849898034u, 670771757u, 2210471108u, 467711165u, 263046873u,
595 3569667915u, 1042291111u, 3863517079u, 1464270005u, 2758321352u,
596 3790799816u, 2301278724u, 3106281430u, 7974801u, 2792461636u,
597 555991332u, 621766759u, 1322453093u, 853629228u, 686962251u,
598 1455120532u, 957753161u, 1802033300u, 1021534190u, 3486047311u,
599 1902128914u, 3701138056u, 4176424663u, 1795608698u, 560858864u,
600 3737752754u, 3141170998u, 1553553385u, 3367807274u, 711546358u,
601 2475125503u, 262969859u, 251416325u, 2980076994u, 1806565895u,
602 969527843u, 3529327173u, 2736343040u, 2987196734u, 1649016367u,
603 2206175811u, 3048174801u, 3662503553u, 3138851612u, 2660143804u,
604 1663017612u, 1816683231u, 411916003u, 3887461314u, 2347044079u,
605 1015311755u, 1203592432u, 2170947766u, 2569420716u, 813872093u,
606 1105387678u, 1431142475u, 220570551u, 4243632715u, 4179591855u,
607 2607469131u, 3090613241u, 282341803u, 1734241730u, 1391822177u,
608 1001254810u, 827927915u, 1886687171u, 3935097347u, 2631788714u,
609 3905163266u, 110554195u, 2447955646u, 3717202975u, 3304793075u,
610 3739614479u, 3059127468u, 953919171u, 2590123714u, 1132511021u,
611 3795593679u, 2788030429u, 982155079u, 3472349556u, 859942552u,
612 2681007391u, 2299624053u, 647443547u, 233600422u, 608168955u,
613 3689327453u, 1849778220u, 1608438222u, 3968158357u, 2692977776u,
614 2851872572u, 246750393u, 3582818628u, 3329652309u, 4036366910u,
615 1012970930u, 950780808u, 3959768744u, 2538550045u, 191422718u,
616 2658142375u, 3276369011u, 2927737484u, 1234200027u, 1920815603u,
617 3536074689u, 1535612501u, 2184142071u, 3276955054u, 428488088u,
618 2378411984u, 4059769550u, 3913744741u, 2732139246u, 64369859u,
619 3755670074u, 842839565u, 2819894466u, 2414718973u, 1010060670u,
620 1839715346u, 2410311136u, 152774329u, 3485009480u, 4102101512u,
621 2852724304u, 879944024u, 1785007662u, 2748284463u, 1354768064u,
622 3267784736u, 2269127717u, 3001240761u, 3179796763u, 895723219u,
623 865924942u, 4291570937u, 89355264u, 1471026971u, 4114180745u,
624 3201939751u, 2867476999u, 2460866060u, 3603874571u, 2238880432u,
625 3308416168u, 2072246611u, 2755653839u, 3773737248u, 1709066580u,
626 4282731467u, 2746170170u, 2832568330u, 433439009u, 3175778732u,
627 26248366u, 2551382801u, 183214346u, 3893339516u, 1928168445u,
628 1337157619u, 3429096554u, 3275170900u, 1782047316u, 4264403756u,
629 1876594403u, 4289659572u, 3223834894u, 1728705513u, 4068244734u,
630 2867840287u, 1147798696u, 302879820u, 1730407747u, 1923824407u,
631 1180597908u, 1569786639u, 198796327u, 560793173u, 2107345620u,
632 2705990316u, 3448772106u, 3678374155u, 758635715u, 884524671u,
633 486356516u, 1774865603u, 3881226226u, 2635213607u, 1181121587u,
634 1508809820u, 3178988241u, 1594193633u, 1235154121u, 326117244u,
635 2304031425u, 937054774u, 2687415945u, 3192389340u, 2003740439u,
636 1823766188u, 2759543402u, 10067710u, 1533252662u, 4132494984u,
637 82378136u, 420615890u, 3467563163u, 541562091u, 3535949864u,
638 2277319197u, 3330822853u, 3215654174u, 4113831979u, 4204996991u,
639 2162248333u, 3255093522u, 2219088909u, 2978279037u, 255818579u,
640 2859348628u, 3097280311u, 2569721123u, 1861951120u, 2907080079u,
641 2719467166u, 998319094u, 2521935127u, 2404125338u, 259456032u,
642 2086860995u, 1839848496u, 1893547357u, 2527997525u, 1489393124u,
643 2860855349u, 76448234u, 2264934035u, 744914583u, 2586791259u,
644 1385380501u, 66529922u, 1819103258u, 1899300332u, 2098173828u,
645 1793831094u, 276463159u, 360132945u, 4178212058u, 595015228u,
646 177071838u, 2800080290u, 1573557746u, 1548998935u, 378454223u,
647 1460534296u, 1116274283u, 3112385063u, 3709761796u, 827999348u,
648 3580042847u, 1913901014u, 614021289u, 4278528023u, 1905177404u,
649 45407939u, 3298183234u, 1184848810u, 3644926330u, 3923635459u,
650 1627046213u, 3677876759u, 969772772u, 1160524753u, 1522441192u,
651 452369933u, 1527502551u, 832490847u, 1003299676u, 1071381111u,
652 2891255476u, 973747308u, 4086897108u, 1847554542u, 3895651598u,
653 2227820339u, 1621250941u, 2881344691u, 3583565821u, 3510404498u,
654 849362119u, 862871471u, 797858058u, 2867774932u, 2821282612u,
655 3272403146u, 3997979905u, 209178708u, 1805135652u, 6783381u,
656 2823361423u, 792580494u, 4263749770u, 776439581u, 3798193823u,
657 2853444094u, 2729507474u, 1071873341u, 1329010206u, 1289336450u,
658 3327680758u, 2011491779u, 80157208u, 922428856u, 1158943220u,
659 1667230961u, 2461022820u, 2608845159u, 387516115u, 3345351910u,
660 1495629111u, 4098154157u, 3156649613u, 3525698599u, 4134908037u,
661 446713264u, 2137537399u, 3617403512u, 813966752u, 1157943946u,
662 3734692965u, 1680301658u, 3180398473u, 3509854711u, 2228114612u,
663 1008102291u, 486805123u, 863791847u, 3189125290u, 1050308116u,
664 3777341526u, 4291726501u, 844061465u, 1347461791u, 2826481581u,
665 745465012u, 2055805750u, 4260209475u, 2386693097u, 2980646741u,
666 447229436u, 2077782664u, 1232942813u, 4023002732u, 1399011509u,
667 3140569849u, 2579909222u, 3794857471u, 900758066u, 2887199683u,
668 1720257997u, 3367494931u, 2668921229u, 955539029u, 3818726432u,
669 1105704962u, 3889207255u, 2277369307u, 2746484505u, 1761846513u,
670 2413916784u, 2685127085u, 4240257943u, 1166726899u, 4215215715u,
671 3082092067u, 3960461946u, 1663304043u, 2087473241u, 4162589986u,
672 2507310778u, 1579665506u, 767234210u, 970676017u, 492207530u,
673 1441679602u, 1314785090u, 3262202570u, 3417091742u, 1561989210u,
674 3011406780u, 1146609202u, 3262321040u, 1374872171u, 1634688712u,
675 1280458888u, 2230023982u, 419323804u, 3262899800u, 39783310u,
676 1641619040u, 1700368658u, 2207946628u, 2571300939u, 2424079766u,
677 780290914u, 2715195096u, 3390957695u, 163151474u, 2309534542u,
678 1860018424u, 555755123u, 280320104u, 1604831083u, 2713022383u,
679 1728987441u, 3639955502u, 623065489u, 3828630947u, 4275479050u,
680 3516347383u, 2343951195u, 2430677756u, 635534992u, 3868699749u,
681 808442435u, 3070644069u, 4282166003u, 2093181383u, 2023555632u,
682 1568662086u, 3422372620u, 4134522350u, 3016979543u, 3259320234u,
683 2888030729u, 3185253876u, 4258779643u, 1267304371u, 1022517473u,
684 815943045u, 929020012u, 2995251018u, 3371283296u, 3608029049u,
685 2018485115u, 122123397u, 2810669150u, 1411365618u, 1238391329u,
686 1186786476u, 3155969091u, 2242941310u, 1765554882u, 279121160u,
687 4279838515u, 1641578514u, 3796324015u, 13351065u, 103516986u,
688 1609694427u, 551411743u, 2493771609u, 1316337047u, 3932650856u,
689 4189700203u, 463397996u, 2937735066u, 1855616529u, 2626847990u,
690 55091862u, 3823351211u, 753448970u, 4045045500u, 1274127772u,
691 1124182256u, 92039808u, 2126345552u, 425973257u, 386287896u,
692 2589870191u, 1987762798u, 4084826973u, 2172456685u, 3366583455u,
693 3602966653u, 2378803535u, 2901764433u, 3716929006u, 3710159000u,
694 2653449155u, 3469742630u, 3096444476u, 3932564653u, 2595257433u,
695 318974657u, 3146202484u, 853571438u, 144400272u, 3768408841u,
696 782634401u, 2161109003u, 570039522u, 1886241521u, 14249488u,
697 2230804228u, 1604941699u, 3928713335u, 3921942509u, 2155806892u,
698 134366254u, 430507376u, 1924011722u, 276713377u, 196481886u,
699 3614810992u, 1610021185u, 1785757066u, 851346168u, 3761148643u,
700 2918835642u, 3364422385u, 3012284466u, 3735958851u, 2643153892u,
701 3778608231u, 1164289832u, 205853021u, 2876112231u, 3503398282u,
702 3078397001u, 3472037921u, 1748894853u, 2740861475u, 316056182u,
703 1660426908u, 168885906u, 956005527u, 3984354789u, 566521563u,
704 1001109523u, 1216710575u, 2952284757u, 3834433081u, 3842608301u,
705 2467352408u, 3974441264u, 3256601745u, 1409353924u, 1329904859u,
706 2307560293u, 3125217879u, 3622920184u, 3832785684u, 3882365951u,
707 2308537115u, 2659155028u, 1450441945u, 3532257603u, 3186324194u,
708 1225603425u, 1124246549u, 175808705u, 3009142319u, 2796710159u,
709 3651990107u, 160762750u, 1902254979u, 1698648476u, 1134980669u,
710 497144426u, 3302689335u, 4057485630u, 3603530763u, 4087252587u,
711 427812652u, 286876201u, 823134128u, 1627554964u, 3745564327u,
712 2589226092u, 4202024494u, 62878473u, 3275585894u, 3987124064u,
713 2791777159u, 1916869511u, 2585861905u, 1375038919u, 1403421920u,
714 60249114u, 3811870450u, 3021498009u, 2612993202u, 528933105u,
715 2757361321u, 3341402964u, 2621861700u, 273128190u, 4015252178u,
716 3094781002u, 1621621288u, 2337611177u, 1796718448u, 1258965619u,
717 4241913140u, 2138560392u, 3022190223u, 4174180924u, 450094611u,
718 3274724580u, 617150026u, 2704660665u, 1469700689u, 1341616587u,
719 356715071u, 1188789960u, 2278869135u, 1766569160u, 2795896635u,
720 57824704u, 2893496380u, 1235723989u, 1630694347u, 3927960522u,
721 428891364u, 1814070806u, 2287999787u, 4125941184u, 3968103889u,
722 3548724050u, 1025597707u, 1404281500u, 2002212197u, 92429143u,
723 2313943944u, 2403086080u, 3006180634u, 3561981764u, 1671860914u,
724 1768520622u, 1803542985u, 844848113u, 3006139921u, 1410888995u,
725 1157749833u, 2125704913u, 1789979528u, 1799263423u, 741157179u,
726 2405862309u, 767040434u, 2655241390u, 3663420179u, 2172009096u,
727 2511931187u, 1680542666u, 231857466u, 1154981000u, 157168255u,
728 1454112128u, 3505872099u, 1929775046u, 2309422350u, 2143329496u,
729 2960716902u, 407610648u, 2938108129u, 2581749599u, 538837155u,
730 2342628867u, 430543915u, 740188568u, 1937713272u, 3315215132u,
731 2085587024u, 4030765687u, 766054429u, 3517641839u, 689721775u,
732 1294158986u, 1753287754u, 4202601348u, 1974852792u, 33459103u,
733 3568087535u, 3144677435u, 1686130825u, 4134943013u, 3005738435u,
734 3599293386u, 426570142u, 754104406u, 3660892564u, 1964545167u,
735 829466833u, 821587464u, 1746693036u, 1006492428u, 1595312919u,
736 1256599985u, 1024482560u, 1897312280u, 2902903201u, 691790057u,
737 1037515867u, 3176831208u, 1968401055u, 2173506824u, 1089055278u,
738 1748401123u, 2941380082u, 968412354u, 1818753861u, 2973200866u,
739 3875951774u, 1119354008u, 3988604139u, 1647155589u, 2232450826u,
740 3486058011u, 3655784043u, 3759258462u, 847163678u, 1082052057u,
741 989516446u, 2871541755u, 3196311070u, 3929963078u, 658187585u,
742 3664944641u, 2175149170u, 2203709147u, 2756014689u, 2456473919u,
743 3890267390u, 1293787864u, 2830347984u, 3059280931u, 4158802520u,
744 1561677400u, 2586570938u, 783570352u, 1355506163u, 31495586u,
745 3789437343u, 3340549429u, 2092501630u, 896419368u, 671715824u,
746 3530450081u, 3603554138u, 1055991716u, 3442308219u, 1499434728u,
747 3130288473u, 3639507000u, 17769680u, 2259741420u, 487032199u,
748 4227143402u, 3693771256u, 1880482820u, 3924810796u, 381462353u,
749 4017855991u, 2452034943u, 2736680833u, 2209866385u, 2128986379u,
750 437874044u, 595759426u, 641721026u, 1636065708u, 3899136933u,
751 629879088u, 3591174506u, 351984326u, 2638783544u, 2348444281u,
752 2341604660u, 2123933692u, 143443325u, 1525942256u, 364660499u,
753 599149312u, 939093251u, 1523003209u, 106601097u, 376589484u,
754 1346282236u, 1297387043u, 764598052u, 3741218111u, 933457002u,
755 1886424424u, 3219631016u, 525405256u, 3014235619u, 323149677u,
756 2038881721u, 4100129043u, 2851715101u, 2984028078u, 1888574695u,
757 2014194741u, 3515193880u, 4180573530u, 3461824363u, 2641995497u,
758 3179230245u, 2902294983u, 2217320456u, 4040852155u, 1784656905u,
759 3311906931u, 87498458u, 2752971818u, 2635474297u, 2831215366u,
760 3682231106u, 2920043893u, 3772929704u, 2816374944u, 309949752u,
761 2383758854u, 154870719u, 385111597u, 1191604312u, 1840700563u,
762 872191186u, 2925548701u, 1310412747u, 2102066999u, 1504727249u,
763 3574298750u, 1191230036u, 3330575266u, 3180292097u, 3539347721u,
764 681369118u, 3305125752u, 3648233597u, 950049240u, 4173257693u,
765 1760124957u, 512151405u, 681175196u, 580563018u, 1169662867u,
766 4015033554u, 2687781101u, 699691603u, 2673494188u, 1137221356u,
767 123599888u, 472658308u, 1053598179u, 1012713758u, 3481064843u,
768 3759461013u, 3981457956u, 3830587662u, 1877191791u, 3650996736u,
769 988064871u, 3515461600u, 4089077232u, 2225147448u, 1249609188u,
770 2643151863u, 3896204135u, 2416995901u, 1397735321u, 3460025646u
771 };
772
773 static const uint32 InitKey[] = { 0x123u, 0x234u, 0x345u, 0x456u };
774 SerialMersenneTwister rng(InitKey, countof(InitKey));
775
776 for (size_t i = 0; i < 1000; ++i)
777 EXPECT_EQ(Expected[i], rng.rand_uint32());
778 }
779 }
780
781 #ifdef APPLESEED_USE_SSE
782
TEST_SUITE(Foundation_Math_RNG_SimdMersenneTwister)783 TEST_SUITE(Foundation_Math_RNG_SimdMersenneTwister)
784 {
785 TEST_CASE(CheckThousandFirstOutputValues)
786 {
787 static const uint32 Expected[1000] =
788 {
789 3886407011u, 4281800351u, 111076728u, 81347708u, 3833203606u,
790 556297090u, 4292688708u, 260342669u, 3323730357u, 155924424u,
791 1997838194u, 3088719549u, 1161211799u, 293884415u, 3487150750u,
792 3861616023u, 2769694646u, 3011126040u, 262311224u, 2581246133u,
793 3996561926u, 1037905631u, 2726942113u, 3074783864u, 2522595150u,
794 273794672u, 3451558636u, 4031719585u, 2696404308u, 2525707734u,
795 1576178264u, 4274454893u, 1743616231u, 1080187283u, 330955672u,
796 1152561996u, 2918045222u, 265585965u, 1338757171u, 1745764590u,
797 1060801047u, 3614387191u, 33931444u, 3178875627u, 1417632743u,
798 2506314056u, 2124201440u, 407821907u, 3169932376u, 2523587590u,
799 3037554570u, 1953296404u, 922513475u, 1128201577u, 1170419982u,
800 2728966839u, 1022270193u, 2450795268u, 3109694330u, 8260451u,
801 1516342905u, 1435585434u, 2677755295u, 56794240u, 2746665314u,
802 1328679627u, 1276249610u, 1528496398u, 3094963307u, 3722760421u,
803 208123785u, 1804878568u, 586130022u, 3428497868u, 1359379625u,
804 4265212767u, 4031061886u, 44831066u, 1145032489u, 2024548506u,
805 3020723704u, 766457964u, 3236660798u, 2137006083u, 4027227077u,
806 3363478772u, 4072818873u, 2766431139u, 1163227543u, 643940996u,
807 1138066267u, 4186824334u, 3714278977u, 263076582u, 3349533518u,
808 571545736u, 2150263036u, 2532756744u, 3936093178u, 1513889719u,
809 1745352786u, 1656966430u, 1216370458u, 2503054925u, 3665736300u,
810 1575545695u, 375444373u, 2999010119u, 2115967604u, 3172776887u,
811 465140534u, 3798324645u, 977467577u, 3308178348u, 2937569156u,
812 2255472861u, 2829925437u, 2167167874u, 3432646076u, 2811216535u,
813 3570586428u, 3025152843u, 1594735626u, 3383030628u, 3181186026u,
814 802974985u, 3683451150u, 705220991u, 3880500653u, 1390427452u,
815 407874837u, 3390122460u, 1366012681u, 893734678u, 1337857272u,
816 1996859867u, 628641020u, 2493672336u, 1547585818u, 862987700u,
817 1606354437u, 1070426107u, 426052289u, 2177883338u, 3495965601u,
818 2207329451u, 758331906u, 1408123471u, 1255269424u, 3674545455u,
819 2830676914u, 1684133988u, 304750832u, 900679206u, 2897402762u,
820 4008082397u, 2514162932u, 2383761693u, 3018319380u, 2690491913u,
821 1181090043u, 638491075u, 3266620013u, 3540383625u, 1273518795u,
822 487561245u, 4088046970u, 1255768239u, 3814793891u, 1004485133u,
823 2155759887u, 1870125254u, 2948424167u, 2294936691u, 627742802u,
824 4071705078u, 1954110383u, 3729581021u, 744048688u, 2012419079u,
825 2446564917u, 3594603404u, 1973206478u, 2621088187u, 2395875201u,
826 3485361773u, 420519696u, 410396687u, 2142731670u, 4241585820u,
827 3216169587u, 1055926832u, 1225242494u, 2580921156u, 2295439545u,
828 1860970055u, 1197258090u, 534689955u, 128303446u, 2542298009u,
829 2470895634u, 2423079975u, 2563807503u, 157276933u, 2183621728u,
830 1050536500u, 3314069262u, 3589471524u, 3464182125u, 1635073681u,
831 332887291u, 1054575134u, 3385321612u, 1563394065u, 1179740749u,
832 425655594u, 266114324u, 3264456074u, 899156497u, 3566843631u,
833 1527686675u, 3017375154u, 1056374060u, 3208904061u, 3962046851u,
834 2002878677u, 1427755009u, 632165846u, 3783730489u, 3556960643u,
835 1759787258u, 3558288429u, 3813141183u, 1415714413u, 2990026503u,
836 3326805639u, 834862637u, 3877827029u, 506216427u, 4025413172u,
837 2514251441u, 1662755812u, 827708521u, 2284667052u, 2287033772u,
838 3860110996u, 2963598547u, 2098547079u, 1639755167u, 3701127300u,
839 615245480u, 3315632161u, 655986141u, 3553163384u, 3914455257u,
840 2026638759u, 1081375798u, 2543358743u, 1501975602u, 2829952981u,
841 1568905036u, 3549344007u, 3993544389u, 3922902403u, 1945601039u,
842 4117478936u, 4294179351u, 3803974482u, 3519181318u, 1736601686u,
843 283422918u, 878255976u, 2570293325u, 3953290202u, 3494798861u,
844 3647753889u, 4261599140u, 43477882u, 882694644u, 916427300u,
845 1883469962u, 3472070446u, 840948062u, 1070838388u, 2938640304u,
846 170924456u, 413157396u, 1688788798u, 845338463u, 207677638u,
847 2374054979u, 3093598473u, 3216598376u, 248499183u, 3967759055u,
848 2799718086u, 2162269376u, 628483893u, 3393868716u, 537353077u,
849 225772197u, 1276357535u, 1151386419u, 3799648942u, 775717262u,
850 3421191342u, 3352369495u, 1176301660u, 826903438u, 771955966u,
851 703662455u, 3500408312u, 3965812397u, 2634406388u, 2600638422u,
852 433900783u, 1881539355u, 152614188u, 1001034390u, 3419274097u,
853 3607958781u, 3263009089u, 1381719055u, 3608460687u, 699585901u,
854 2601456738u, 701827720u, 161788133u, 3114037508u, 1730058740u,
855 1935321590u, 809764901u, 3015873875u, 996900766u, 1265496117u,
856 601954268u, 3324915628u, 3267673720u, 3128655414u, 2061992616u,
857 1225068379u, 4034553293u, 3219516429u, 2354106088u, 3712443016u,
858 3558482352u, 3424565169u, 66652973u, 1602369262u, 2478405431u,
859 1953215718u, 3763884955u, 2321961497u, 4034846225u, 2964427848u,
860 2980412529u, 1043681536u, 78708356u, 2123693711u, 3749757828u,
861 1699587788u, 3325106880u, 1533138712u, 966842782u, 2142041330u,
862 331951290u, 2839273949u, 2638662908u, 3057242914u, 2615193128u,
863 1453714199u, 2134977452u, 182401908u, 1999564260u, 1760207124u,
864 2351213662u, 2733285744u, 745935144u, 4278636179u, 1861789766u,
865 3644538614u, 1504874763u, 4169371238u, 139285714u, 3237710933u,
866 2912828465u, 63556721u, 2424288873u, 1465498015u, 1750094812u,
867 3387255961u, 986980570u, 3520636206u, 3703009884u, 1810627870u,
868 638247367u, 800103969u, 533461354u, 3719164082u, 3416617704u,
869 582286943u, 107138412u, 2694850090u, 2191567919u, 663787068u,
870 3905244492u, 1075793301u, 3963296145u, 498654974u, 415913859u,
871 224922429u, 957693135u, 20753421u, 3604487226u, 176245419u,
872 756236270u, 1802741190u, 1167371933u, 2739973610u, 3528781257u,
873 1157415106u, 1118820636u, 3458247496u, 3426071999u, 1513516168u,
874 541006827u, 1567502872u, 1054211972u, 3108187973u, 3568355298u,
875 437544707u, 215493191u, 3406703434u, 3321185867u, 1772491122u,
876 3914720953u, 1014598723u, 333918716u, 3041884855u, 2375348211u,
877 170098352u, 240932703u, 936627316u, 2139228141u, 3059916219u,
878 2513963963u, 112660118u, 4220599362u, 1082041605u, 3602805569u,
879 2384684624u, 1330834152u, 4182800709u, 3009712734u, 4257523904u,
880 2159731903u, 2025797850u, 2056433570u, 349278747u, 1170424171u,
881 257898828u, 2188000674u, 1204405272u, 3389713953u, 4274421883u,
882 2794662087u, 2460352864u, 3127675894u, 3021639524u, 608028006u,
883 2111707400u, 1787005794u, 3843272691u, 3141988567u, 4196077997u,
884 2897702537u, 3372399131u, 3582063297u, 1578673893u, 4158772308u,
885 4169229718u, 1109608889u, 3321413183u, 3071034348u, 3753529331u,
886 1345899260u, 412497490u, 147621430u, 214318180u, 1578418651u,
887 3343150529u, 1254740020u, 3717298856u, 3299809204u, 3760154252u,
888 678106837u, 1480589570u, 2779667743u, 3703299966u, 1996609972u,
889 2450960405u, 2217729665u, 263095858u, 3896594109u, 3706821089u,
890 1779331587u, 944437701u, 1816667206u, 3470975262u, 2665594204u,
891 3272830417u, 3383291758u, 1100553215u, 3066409484u, 2255953998u,
892 4263120961u, 3903080396u, 3118336282u, 1244930791u, 2776135295u,
893 404172911u, 935988779u, 3021878898u, 2591140119u, 2855279657u,
894 828977189u, 1349880831u, 271405633u, 513887183u, 973977998u,
895 818498047u, 3759094702u, 1967989616u, 1645739285u, 2450937230u,
896 3394484130u, 3802347325u, 4188056776u, 1678519011u, 4011608337u,
897 3345802689u, 3739063605u, 515149797u, 4110693634u, 286359712u,
898 58159003u, 1620037343u, 1758736877u, 1108416461u, 978633298u,
899 3908170134u, 832999193u, 3865630340u, 2696419612u, 4213969249u,
900 649970127u, 612427777u, 1300765532u, 75897263u, 1394767950u,
901 920233303u, 2590798616u, 3717554842u, 1279020975u, 594203750u,
902 2514263416u, 2806336875u, 1893328899u, 3341401053u, 2408038972u,
903 1199628776u, 169610427u, 3626403286u, 2076132929u, 2304947701u,
904 1022870336u, 2137468039u, 1261296863u, 2927753974u, 2127572634u,
905 522582313u, 1753082133u, 3047778755u, 1097852750u, 2117585055u,
906 1342268395u, 3018704691u, 2039924086u, 4085013780u, 1150098139u,
907 1471970342u, 132882672u, 3577285283u, 1493520392u, 2365018644u,
908 1080368309u, 1593880224u, 2525716814u, 1220265805u, 3235772869u,
909 1140912993u, 1568018248u, 1847630808u, 2235016934u, 1969624960u,
910 2400798963u, 396529293u, 2876404082u, 374115476u, 3767411509u,
911 3686923286u, 269156713u, 1184297508u, 156613232u, 1608282564u,
912 1655626368u, 2286043979u, 4148499352u, 1400217329u, 746989267u,
913 118760232u, 3754761427u, 3991461457u, 1749683603u, 1448174823u,
914 1250954867u, 846463124u, 3958695790u, 3740351386u, 1632150808u,
915 3007550551u, 382880029u, 1194390993u, 1111682635u, 1559692800u,
916 2257958687u, 3155266410u, 2072536932u, 332962507u, 298440753u,
917 3586996064u, 1418147869u, 3646770130u, 589633801u, 1637972417u,
918 3421417825u, 891276907u, 2517892630u, 926748506u, 1448212968u,
919 1195763027u, 1191407415u, 1266564261u, 2446003846u, 739349380u,
920 2241384648u, 2419433486u, 1265848908u, 3540493819u, 3044389380u,
921 1180551193u, 385247912u, 3687971870u, 2933470163u, 1766292638u,
922 3920228013u, 4083968751u, 190207421u, 1897154699u, 1385999625u,
923 2589249091u, 13835880u, 3271302978u, 2807909185u, 1016922355u,
924 1630163316u, 3203254919u, 328188864u, 3987127570u, 1339850346u,
925 3114841550u, 2056796190u, 1661852945u, 2276546573u, 744577169u,
926 917967899u, 442985033u, 25425073u, 1772015325u, 1010457171u,
927 4199113754u, 2455595434u, 3779198526u, 424018762u, 1252182525u,
928 1500859734u, 1725596044u, 2179270330u, 3664653997u, 4060184295u,
929 4186918346u, 1230931642u, 2535369803u, 793762983u, 902779486u,
930 904819110u, 2106795553u, 1831821629u, 151770440u, 1060730346u,
931 260686731u, 3294302589u, 3812541728u, 2973165963u, 2769787748u,
932 835036584u, 1083164731u, 2357980787u, 1929093551u, 2774918826u,
933 21130448u, 3175936845u, 1486132047u, 4239744808u, 2950777361u,
934 3275643323u, 798179670u, 3634512791u, 3247651617u, 2623076444u,
935 1537428657u, 2099953068u, 908422971u, 369554428u, 119654834u,
936 1908459851u, 2560578188u, 2508436783u, 842226718u, 3437664571u,
937 3013183632u, 3419217136u, 1843555493u, 1288043476u, 198949359u,
938 2301813358u, 3675127261u, 2194239682u, 932293292u, 3754075039u,
939 1973360323u, 3784392333u, 1750909788u, 3778476827u, 3460291337u,
940 562801776u, 2829044007u, 1604539079u, 283365056u, 3280005866u,
941 1657415187u, 1950125903u, 700130005u, 3904988368u, 3209052907u,
942 264582882u, 490291266u, 3717352569u, 4103454345u, 474608553u,
943 3475119427u, 2360352432u, 2209943635u, 1388164703u, 471352122u,
944 2141591474u, 3500735720u, 8628640u, 2723436555u, 1457353421u,
945 3806358987u, 126793832u, 2251508000u, 916638683u, 933016742u,
946 3258782483u, 2671016879u, 4190126941u, 432086625u, 2127430287u,
947 1815440924u, 2651537029u, 3907132339u, 1091780759u, 465703611u,
948 3797184691u, 4076964944u, 1595769747u, 2154333579u, 2176806859u,
949 2877767259u, 666774740u, 3493648241u, 992488857u, 685541424u,
950 2937035147u, 2138525956u, 276742083u, 3030023740u, 1724350182u,
951 3561824424u, 2439326329u, 3137727159u, 3532825602u, 1286564361u,
952 1730650038u, 47146502u, 1947106164u, 2290693563u, 4237554375u,
953 2169460395u, 627198754u, 3267785934u, 3566267767u, 4211412669u,
954 1792274052u, 1558402694u, 3820357323u, 3173149465u, 3611342013u,
955 1626682141u, 1023174572u, 2647755299u, 1086682257u, 3281068297u,
956 2065457709u, 2600564494u, 3174357564u, 1064120822u, 3475948281u,
957 2666195316u, 813720511u, 1199782038u, 1186848860u, 3437401358u,
958 316880925u, 3547090326u, 2098800099u, 798689186u, 1622398727u,
959 650571965u, 477578967u, 1710157637u, 485820455u, 2918314263u,
960 3624842452u, 513206005u, 2879275335u, 2573728817u, 1579049169u,
961 1335411179u, 3620442791u, 377149333u, 2189934814u, 152599344u,
962 60641839u, 3947277983u, 2789496747u, 2458234304u, 803406288u,
963 1881317851u, 914125287u, 1158363406u, 3732087233u, 2747813553u,
964 2718658944u, 170436177u, 1191389821u, 1698013158u, 1929268873u,
965 1812478568u, 389149994u, 552849236u, 1067196635u, 1253573071u,
966 1875541284u, 1385293163u, 3094213125u, 2838399165u, 1045337537u,
967 1117641174u, 2526606585u, 354148334u, 3650301072u, 2522676029u,
968 3187829406u, 348039809u, 767130823u, 2342437211u, 533819297u,
969 3335749811u, 1530481294u, 868079141u, 388761146u, 4143832711u,
970 1282640156u, 3569483026u, 4102521131u, 1945436946u, 990432123u,
971 1989239488u, 3368237538u, 1074880654u, 1395154184u, 2893151289u,
972 998491299u, 4287341670u, 1965026764u, 2177870538u, 1424793411u,
973 4171480614u, 3739859402u, 2291099898u, 1517589883u, 1276318754u,
974 1928061503u, 67287416u, 3453716755u, 2295378035u, 1392343377u,
975 2292365750u, 2129040008u, 2254206651u, 2955135517u, 758411760u,
976 967043516u, 107901946u, 117314340u, 3603424360u, 1671012578u,
977 2219728876u, 2912517093u, 3166690820u, 2240095861u, 2176390337u,
978 947054314u, 2480610701u, 1510770649u, 770741919u, 184855908u,
979 4284459040u, 3002676248u, 2500892156u, 1092722404u, 1357944234u,
980 2758390695u, 1117396783u, 193686985u, 1758642792u, 214081719u,
981 1882715032u, 454274397u, 1878991883u, 520172897u, 1262447113u,
982 1467673599u, 2101685657u, 152140659u, 1868719962u, 1792314094u,
983 96111461u, 388908112u, 3213133738u, 2553788568u, 1093991166u,
984 2841328708u, 484504627u, 162274077u, 3134232148u, 3856069681u,
985 1125009861u, 648021349u, 4150339832u, 2401353698u, 317094232u,
986 3065672900u, 2834089878u, 1712791505u, 1400354166u, 4057054433u,
987 1852171224u, 2757365820u, 2653144471u, 510164898u, 2912173236u,
988 2130137889u, 585288649u, 2141196576u, 1291263962u, 3837327574u
989 };
990
991 static const uint32 InitKey[] = { 0x123u, 0x234u, 0x345u, 0x456u };
992 SimdMersenneTwister rng(InitKey, countof(InitKey));
993
994 for (size_t i = 0; i < 1000; ++i)
995 EXPECT_EQ(Expected[i], rng.rand_uint32());
996 }
997 }
998
999 #endif
1000