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