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