xref: /aosp_15_r20/external/deqp/framework/delibs/decpp/deRandom.cpp (revision 35238bce31c2a825756842865a792f8cf7f89930)
1*35238bceSAndroid Build Coastguard Worker /*-------------------------------------------------------------------------
2*35238bceSAndroid Build Coastguard Worker  * drawElements C++ Base Library
3*35238bceSAndroid Build Coastguard Worker  * -----------------------------
4*35238bceSAndroid Build Coastguard Worker  *
5*35238bceSAndroid Build Coastguard Worker  * Copyright 2014 The Android Open Source Project
6*35238bceSAndroid Build Coastguard Worker  *
7*35238bceSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
8*35238bceSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
9*35238bceSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
10*35238bceSAndroid Build Coastguard Worker  *
11*35238bceSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
12*35238bceSAndroid Build Coastguard Worker  *
13*35238bceSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
14*35238bceSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
15*35238bceSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16*35238bceSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
17*35238bceSAndroid Build Coastguard Worker  * limitations under the License.
18*35238bceSAndroid Build Coastguard Worker  *
19*35238bceSAndroid Build Coastguard Worker  *//*!
20*35238bceSAndroid Build Coastguard Worker  * \file
21*35238bceSAndroid Build Coastguard Worker  * \brief Random number generator utilities.
22*35238bceSAndroid Build Coastguard Worker  *//*--------------------------------------------------------------------*/
23*35238bceSAndroid Build Coastguard Worker 
24*35238bceSAndroid Build Coastguard Worker #include "deRandom.hpp"
25*35238bceSAndroid Build Coastguard Worker 
operator ==(const deRandom & a,const deRandom & b)26*35238bceSAndroid Build Coastguard Worker inline bool operator==(const deRandom &a, const deRandom &b)
27*35238bceSAndroid Build Coastguard Worker {
28*35238bceSAndroid Build Coastguard Worker     return a.x == b.x && a.y == b.y && a.z == b.z && a.w == b.w;
29*35238bceSAndroid Build Coastguard Worker }
30*35238bceSAndroid Build Coastguard Worker 
operator !=(const deRandom & a,const deRandom & b)31*35238bceSAndroid Build Coastguard Worker inline bool operator!=(const deRandom &a, const deRandom &b)
32*35238bceSAndroid Build Coastguard Worker {
33*35238bceSAndroid Build Coastguard Worker     return a.x != b.x || a.y != b.y || a.z != b.z || a.w != b.w;
34*35238bceSAndroid Build Coastguard Worker }
35*35238bceSAndroid Build Coastguard Worker 
36*35238bceSAndroid Build Coastguard Worker namespace de
37*35238bceSAndroid Build Coastguard Worker {
38*35238bceSAndroid Build Coastguard Worker 
operator ==(const Random & other) const39*35238bceSAndroid Build Coastguard Worker bool Random::operator==(const Random &other) const
40*35238bceSAndroid Build Coastguard Worker {
41*35238bceSAndroid Build Coastguard Worker     return m_rnd == other.m_rnd;
42*35238bceSAndroid Build Coastguard Worker }
43*35238bceSAndroid Build Coastguard Worker 
operator !=(const Random & other) const44*35238bceSAndroid Build Coastguard Worker bool Random::operator!=(const Random &other) const
45*35238bceSAndroid Build Coastguard Worker {
46*35238bceSAndroid Build Coastguard Worker     return m_rnd != other.m_rnd;
47*35238bceSAndroid Build Coastguard Worker }
48*35238bceSAndroid Build Coastguard Worker 
Random_selfTest(void)49*35238bceSAndroid Build Coastguard Worker void Random_selfTest(void)
50*35238bceSAndroid Build Coastguard Worker {
51*35238bceSAndroid Build Coastguard Worker     // getBool()
52*35238bceSAndroid Build Coastguard Worker 
53*35238bceSAndroid Build Coastguard Worker     {
54*35238bceSAndroid Build Coastguard Worker         static const bool expected[] = {true,  false, false, false, true, true,  false, false, false, false,
55*35238bceSAndroid Build Coastguard Worker                                         false, false, true,  false, true, false, false, false, false, true};
56*35238bceSAndroid Build Coastguard Worker         Random rnd(4789);
57*35238bceSAndroid Build Coastguard Worker         for (int i = 0; i < DE_LENGTH_OF_ARRAY(expected); i++)
58*35238bceSAndroid Build Coastguard Worker             DE_TEST_ASSERT(expected[i] == rnd.getBool());
59*35238bceSAndroid Build Coastguard Worker     }
60*35238bceSAndroid Build Coastguard Worker 
61*35238bceSAndroid Build Coastguard Worker     // getInt(a, b)
62*35238bceSAndroid Build Coastguard Worker 
63*35238bceSAndroid Build Coastguard Worker     {
64*35238bceSAndroid Build Coastguard Worker         static const int expected[] = {-6628, -6483, 802, -7758, -8463, 3165, 9216, 3107, 1851, 8707};
65*35238bceSAndroid Build Coastguard Worker         Random rnd(4789);
66*35238bceSAndroid Build Coastguard Worker         for (int i = 0; i < DE_LENGTH_OF_ARRAY(expected); i++)
67*35238bceSAndroid Build Coastguard Worker             DE_TEST_ASSERT(expected[i] == rnd.getInt(-10000, 10000));
68*35238bceSAndroid Build Coastguard Worker     }
69*35238bceSAndroid Build Coastguard Worker 
70*35238bceSAndroid Build Coastguard Worker     // getUint32()
71*35238bceSAndroid Build Coastguard Worker 
72*35238bceSAndroid Build Coastguard Worker     {
73*35238bceSAndroid Build Coastguard Worker         static const uint32_t expected[] = {3694588092u, 3135240271u, 882874943u,  2108407657u, 376640368u,
74*35238bceSAndroid Build Coastguard Worker                                             1395362929u, 2611849801u, 3151830690u, 901476922u,  989608184u};
75*35238bceSAndroid Build Coastguard Worker         Random rnd(4789);
76*35238bceSAndroid Build Coastguard Worker         for (int i = 0; i < DE_LENGTH_OF_ARRAY(expected); i++)
77*35238bceSAndroid Build Coastguard Worker             DE_TEST_ASSERT(expected[i] == rnd.getUint32());
78*35238bceSAndroid Build Coastguard Worker     }
79*35238bceSAndroid Build Coastguard Worker 
80*35238bceSAndroid Build Coastguard Worker     // getUint64()
81*35238bceSAndroid Build Coastguard Worker 
82*35238bceSAndroid Build Coastguard Worker     {
83*35238bceSAndroid Build Coastguard Worker         static const uint64_t expected[] = {15868135030466279503ull, 3791919008751271785ull,  1617658064308767857ull,
84*35238bceSAndroid Build Coastguard Worker                                             11217809480510938786ull, 3871813899078351096ull,  14768747990643252542ull,
85*35238bceSAndroid Build Coastguard Worker                                             8163484985646009214ull,  14928018127607458387ull, 432108271545246292ull,
86*35238bceSAndroid Build Coastguard Worker                                             7318152987070448462ull};
87*35238bceSAndroid Build Coastguard Worker         Random rnd(4789);
88*35238bceSAndroid Build Coastguard Worker         for (int i = 0; i < DE_LENGTH_OF_ARRAY(expected); i++)
89*35238bceSAndroid Build Coastguard Worker             DE_TEST_ASSERT(expected[i] == rnd.getUint64());
90*35238bceSAndroid Build Coastguard Worker     }
91*35238bceSAndroid Build Coastguard Worker 
92*35238bceSAndroid Build Coastguard Worker     // getFloat()
93*35238bceSAndroid Build Coastguard Worker 
94*35238bceSAndroid Build Coastguard Worker     {
95*35238bceSAndroid Build Coastguard Worker         static const float expected[] = {0.763413f, 0.679680f, 0.288965f, 0.854431f, 0.403095f,
96*35238bceSAndroid Build Coastguard Worker                                          0.198132f, 0.729899f, 0.741484f, 0.358263f, 0.686578f};
97*35238bceSAndroid Build Coastguard Worker         const float epsilon           = 0.01f;
98*35238bceSAndroid Build Coastguard Worker         Random rnd(4789);
99*35238bceSAndroid Build Coastguard Worker         for (int i = 0; i < DE_LENGTH_OF_ARRAY(expected); i++)
100*35238bceSAndroid Build Coastguard Worker             DE_TEST_ASSERT(de::abs(expected[i] - rnd.getFloat()) < epsilon);
101*35238bceSAndroid Build Coastguard Worker     }
102*35238bceSAndroid Build Coastguard Worker 
103*35238bceSAndroid Build Coastguard Worker     // getFloat(a, b)
104*35238bceSAndroid Build Coastguard Worker 
105*35238bceSAndroid Build Coastguard Worker     {
106*35238bceSAndroid Build Coastguard Worker         static const float expected[] = {824.996643f,  675.039185f, -24.691774f, 987.999756f, 179.702286f,
107*35238bceSAndroid Build Coastguard Worker                                          -187.365463f, 764.975647f, 785.724182f, 99.413582f,  687.392151f};
108*35238bceSAndroid Build Coastguard Worker         const float epsilon           = 0.01f;
109*35238bceSAndroid Build Coastguard Worker         Random rnd(4789);
110*35238bceSAndroid Build Coastguard Worker         for (int i = 0; i < DE_LENGTH_OF_ARRAY(expected); i++)
111*35238bceSAndroid Build Coastguard Worker             DE_TEST_ASSERT(de::abs(expected[i] - rnd.getFloat(-542.2f, 1248.7f)) < epsilon);
112*35238bceSAndroid Build Coastguard Worker     }
113*35238bceSAndroid Build Coastguard Worker 
114*35238bceSAndroid Build Coastguard Worker     // choose(first, last, resultOut, num)
115*35238bceSAndroid Build Coastguard Worker 
116*35238bceSAndroid Build Coastguard Worker     {
117*35238bceSAndroid Build Coastguard Worker         static const int items[]                    = {3, 42, 45, 123, 654, -123, -90, 0, 43};
118*35238bceSAndroid Build Coastguard Worker         const int numItemsPicked                    = 5;
119*35238bceSAndroid Build Coastguard Worker         static const int expected[][numItemsPicked] = {
120*35238bceSAndroid Build Coastguard Worker             {-123, 42, -90, 123, 43}, {43, 0, -90, 123, -123}, {3, 42, 45, 123, 0},    {3, 42, 45, -123, 654},
121*35238bceSAndroid Build Coastguard Worker             {3, 43, 45, -90, -123},   {-90, 0, 45, -123, 654}, {3, 42, 43, 123, -123}, {-90, 43, 45, 123, 654},
122*35238bceSAndroid Build Coastguard Worker             {0, 42, 45, 123, 654},    {0, -90, 45, -123, 654}};
123*35238bceSAndroid Build Coastguard Worker         Random rnd(4789);
124*35238bceSAndroid Build Coastguard Worker 
125*35238bceSAndroid Build Coastguard Worker         for (int i = 0; i < DE_LENGTH_OF_ARRAY(expected); i++)
126*35238bceSAndroid Build Coastguard Worker         {
127*35238bceSAndroid Build Coastguard Worker             int itemsDst[numItemsPicked];
128*35238bceSAndroid Build Coastguard Worker             rnd.choose(DE_ARRAY_BEGIN(items), DE_ARRAY_END(items), &itemsDst[0], numItemsPicked);
129*35238bceSAndroid Build Coastguard Worker             for (int j = 0; j < numItemsPicked; j++)
130*35238bceSAndroid Build Coastguard Worker                 DE_TEST_ASSERT(expected[i][j] == itemsDst[j]);
131*35238bceSAndroid Build Coastguard Worker         }
132*35238bceSAndroid Build Coastguard Worker     }
133*35238bceSAndroid Build Coastguard Worker 
134*35238bceSAndroid Build Coastguard Worker     // choose(first, last)
135*35238bceSAndroid Build Coastguard Worker 
136*35238bceSAndroid Build Coastguard Worker     {
137*35238bceSAndroid Build Coastguard Worker         static const int items[]    = {3, 42, 45, 123, 654, -123, -90, 0, 43};
138*35238bceSAndroid Build Coastguard Worker         static const int expected[] = {43, 123, -90, -90, 0, 3, 43, 0, 654, 43};
139*35238bceSAndroid Build Coastguard Worker         Random rnd(4789);
140*35238bceSAndroid Build Coastguard Worker 
141*35238bceSAndroid Build Coastguard Worker         for (int i = 0; i < DE_LENGTH_OF_ARRAY(expected); i++)
142*35238bceSAndroid Build Coastguard Worker             DE_TEST_ASSERT(expected[i] == rnd.choose<int>(DE_ARRAY_BEGIN(items), DE_ARRAY_END(items)));
143*35238bceSAndroid Build Coastguard Worker     }
144*35238bceSAndroid Build Coastguard Worker 
145*35238bceSAndroid Build Coastguard Worker     // chooseWeighted(first, last, weights)
146*35238bceSAndroid Build Coastguard Worker 
147*35238bceSAndroid Build Coastguard Worker     {
148*35238bceSAndroid Build Coastguard Worker         static const int items[]     = {3, 42, 45, 123, 654, -123, -90, 0};
149*35238bceSAndroid Build Coastguard Worker         static const float weights[] = {0.4f, 0.6f, 1.5f, 0.5f, 1.2f, 0.3f, 0.2f, 1.4f};
150*35238bceSAndroid Build Coastguard Worker         DE_STATIC_ASSERT(DE_LENGTH_OF_ARRAY(items) == DE_LENGTH_OF_ARRAY(weights));
151*35238bceSAndroid Build Coastguard Worker         static const int expected[] = {-90, 654, 45, 0, 45, 45, -123, -90, 45, 654};
152*35238bceSAndroid Build Coastguard Worker         Random rnd(4789);
153*35238bceSAndroid Build Coastguard Worker 
154*35238bceSAndroid Build Coastguard Worker         for (int i = 0; i < DE_LENGTH_OF_ARRAY(expected); i++)
155*35238bceSAndroid Build Coastguard Worker             DE_TEST_ASSERT(expected[i] ==
156*35238bceSAndroid Build Coastguard Worker                            rnd.chooseWeighted<int>(DE_ARRAY_BEGIN(items), DE_ARRAY_END(items), &weights[0]));
157*35238bceSAndroid Build Coastguard Worker     }
158*35238bceSAndroid Build Coastguard Worker 
159*35238bceSAndroid Build Coastguard Worker     // suffle()
160*35238bceSAndroid Build Coastguard Worker 
161*35238bceSAndroid Build Coastguard Worker     {
162*35238bceSAndroid Build Coastguard Worker         int items[]                                            = {3, 42, 45, 123, 654, -123, -90, 0, 43};
163*35238bceSAndroid Build Coastguard Worker         static const int expected[][DE_LENGTH_OF_ARRAY(items)] = {
164*35238bceSAndroid Build Coastguard Worker             {45, 43, 654, -123, 123, 42, -90, 0, 3}, {0, 43, 3, 42, -123, -90, 654, 45, 123},
165*35238bceSAndroid Build Coastguard Worker             {42, 43, 654, 3, 0, 123, -90, -123, 45}, {3, 45, 43, 42, 123, 654, 0, -90, -123},
166*35238bceSAndroid Build Coastguard Worker             {42, 45, -123, 0, -90, 654, 3, 123, 43}, {654, -123, 3, 42, 43, 0, -90, 123, 45},
167*35238bceSAndroid Build Coastguard Worker             {0, 3, 654, 42, -90, 45, -123, 123, 43}, {654, 3, 45, 42, -123, -90, 123, 43, 0},
168*35238bceSAndroid Build Coastguard Worker             {-90, 123, 43, 654, 0, 42, 45, 3, -123}, {0, -123, 45, 42, 43, 123, 3, -90, 654}};
169*35238bceSAndroid Build Coastguard Worker         Random rnd(4789);
170*35238bceSAndroid Build Coastguard Worker 
171*35238bceSAndroid Build Coastguard Worker         for (int i = 0; i < DE_LENGTH_OF_ARRAY(expected); i++)
172*35238bceSAndroid Build Coastguard Worker         {
173*35238bceSAndroid Build Coastguard Worker             rnd.shuffle(DE_ARRAY_BEGIN(items), DE_ARRAY_END(items));
174*35238bceSAndroid Build Coastguard Worker             for (int j = 0; j < DE_LENGTH_OF_ARRAY(items); j++)
175*35238bceSAndroid Build Coastguard Worker                 DE_TEST_ASSERT(expected[i][j] == items[j]);
176*35238bceSAndroid Build Coastguard Worker         }
177*35238bceSAndroid Build Coastguard Worker     }
178*35238bceSAndroid Build Coastguard Worker }
179*35238bceSAndroid Build Coastguard Worker 
180*35238bceSAndroid Build Coastguard Worker } // namespace de
181