Changeset 2520


Ignore:
Timestamp:
Feb 27, 2013, 10:25:47 AM (8 years ago)
Author:
sam
Message:

math: replace RandF() with a more generic rand() template function
that lets us draw integer random values too.

Location:
trunk
Files:
9 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/easymesh/easymesh.cpp

    r2516 r2520  
    12131213    {
    12141214        if(Welded[j] == -1)
    1215             m_vert[i].m_coord *= 1.0f + RandF(r);
     1215            m_vert[i].m_coord *= 1.0f + rand(r);
    12161216        else
    12171217            m_vert[i].m_coord = m_vert[Welded[j]].m_coord;
  • trunk/src/numeric.h

    r2444 r2520  
    22// Lol Engine
    33//
    4 // Copyright: (c) 2010-2011 Sam Hocevar <sam@hocevar.net>
     4// Copyright: (c) 2010-2013 Sam Hocevar <sam@hocevar.net>
    55//   This program is free software; you can redistribute it and/or
    66//   modify it under the terms of the Do What The Fuck You Want To
     
    2323{
    2424
    25 /* Random float value */
    26 static inline float RandF()
     25/* Random number generators */
     26template<typename T> static inline T rand();
     27template<typename T> static inline T rand(T a);
     28template<typename T> static inline T rand(T a, T b);
     29
     30/* One-value random number generators */
     31template<typename T> static inline T rand(T a)
    2732{
    28     using namespace std;
    29     return (float)std::rand() / RAND_MAX;
     33    return rand<T>() % a;
    3034}
    3135
    32 static inline float RandF(float val)
     36template<>
     37inline half rand<half>(half a) { return a * std::rand() / RAND_MAX; }
     38template<>
     39inline float rand<float>(float a) { return a * std::rand() / RAND_MAX; }
     40template<>
     41inline double rand<double>(double a) { return a * std::rand() / RAND_MAX; }
     42template<>
     43inline ldouble rand<ldouble>(ldouble a) { return a * std::rand() / RAND_MAX; }
     44
     45/* Two-value random number generator -- no need for specialisation */
     46template<typename T> static inline T rand(T a, T b)
    3347{
    34     return RandF() * val;
     48    return a + rand<T>(b - a);
    3549}
    3650
    37 static inline float RandF(float min, float max)
     51/* Default random number generator */
     52template<typename T> static inline T rand()
    3853{
    39     return min + RandF() * (max - min);
     54    switch (sizeof(T))
     55    {
     56    case 1:
     57        return static_cast<T>(std::rand() & 0xff);
     58    case 2:
     59        if (RAND_MAX >= 0xffff)
     60            return static_cast<T>(std::rand());
     61        else
     62            return static_cast<T>((std::rand() << 8) ^ std::rand());
     63    case 4:
     64        if (RAND_MAX >= 0xffff)
     65            return static_cast<T>((std::rand() << 16) ^ std::rand());
     66        else
     67            return static_cast<T>((std::rand() << 24) ^ (std::rand() << 16)
     68                                 ^ (std::rand() << 8) ^ std::rand());
     69    case 8:
     70        if (RAND_MAX >= 0xffff)
     71            return static_cast<T>(((uint64_t)std::rand() << 48)
     72                                ^ ((uint64_t)std::rand() << 32)
     73                                ^ ((uint64_t)std::rand() << 16)
     74                                ^ ((uint64_t)std::rand()));
     75        else
     76            return static_cast<T>(((uint64_t)std::rand() << 56)
     77                                ^ ((uint64_t)std::rand() << 48)
     78                                ^ ((uint64_t)std::rand() << 40)
     79                                ^ ((uint64_t)std::rand() << 32)
     80                                ^ ((uint64_t)std::rand() << 24)
     81                                ^ ((uint64_t)std::rand() << 16)
     82                                ^ ((uint64_t)std::rand() << 8)
     83                                ^ ((uint64_t)std::rand()));
     84    default:
     85        ASSERT(false, "rand() doesn’t support types of size %d\n",
     86               (int)sizeof(T));
     87    }
    4088}
     89
     90template<> inline half rand<half>() { return rand<half>(1.f); }
     91template<> inline float rand<float>() { return rand<float>(1.f); }
     92template<> inline double rand<double>() { return rand<double>(1.0); }
     93template<> inline ldouble rand<ldouble>() { return rand<ldouble>(1.0); }
     94
    4195
    4296/* Next power of two. */
  • trunk/src/scene.cpp

    r2506 r2520  
    217217        {
    218218            Tile tmp = data->m_tiles[i];
    219             int j = std::rand() % data->m_tiles.Count();
     219            int j = rand<int>() % data->m_tiles.Count();
    220220            data->m_tiles[i] = data->m_tiles[j];
    221221            data->m_tiles[j] = tmp;
  • trunk/src/ticker.cpp

    r2506 r2520  
    186186
    187187        /* Ensure some randomness */
    188         (void)std::rand();
     188        rand<int>();
    189189
    190190        /* If recording with fixed framerate, set deltatime to a fixed value */
  • trunk/test/benchmark/half.cpp

    r2183 r2520  
    3838        case 1:
    3939            for (size_t i = 0; i < HALF_TABLE_SIZE + 1; i++)
    40                 ph[i] = half::makebits(rand());
     40                ph[i] = half::makebits(rand<uint16_t>());
    4141            break;
    4242        case 2:
    4343            for (size_t i = 0; i < HALF_TABLE_SIZE + 1; i++)
    44                 ph[i] = RandF(-2.0f, 2.0f);
     44                ph[i] = rand(-2.0f, 2.0f);
    4545            break;
    4646        }
  • trunk/test/benchmark/trig.cpp

    r2216 r2520  
    5252        case 1:
    5353            for (size_t i = 0; i < TRIG_TABLE_SIZE; i++)
    54                 pf[i] = RandF(-1e5f, 1e5f);
     54                pf[i] = rand(-1e5f, 1e5f);
    5555            break;
    5656        case 2:
    5757            for (size_t i = 0; i < TRIG_TABLE_SIZE; i++)
    58                 pf[i] = RandF(-M_PI, M_PI);
     58                pf[i] = rand(-M_PI, M_PI);
    5959            break;
    6060        case 3:
    6161            for (size_t i = 0; i < TRIG_TABLE_SIZE; i++)
    62                 pf[i] = RandF(-1e-2f, 1e-2f);
     62                pf[i] = rand(-1e-2f, 1e-2f);
    6363            break;
    6464        }
  • trunk/test/benchmark/vector.cpp

    r2183 r2520  
    4040                for (int j = 0; j < 4; j++)
    4141                    for (int k = 0; k < 4; k++)
    42                         pm[i][j][k] = RandF(-2.0f, 2.0f);
     42                        pm[i][j][k] = rand(-2.0f, 2.0f);
    4343            break;
    4444        }
  • trunk/test/physicobject.h

    r2451 r2520  
    158158            case 0:
    159159            {
    160                 RandValue = (int)(lol::RandF() * (SphereLimit - 1));
     160                RandValue = rand(SphereLimit);
    161161                break;
    162162            }
    163163            case 1:
    164164            {
    165                 RandValue = SphereLimit + (int)(lol::RandF() * ((ConeLimit - SphereLimit) - 1));
     165                RandValue = rand(SphereLimit, ConeLimit);
    166166                break;
    167167            }
    168168            case 2:
    169169            {
    170                 RandValue = ConeLimit + (int)(lol::RandF() * ((CylLimit - ConeLimit) - 1));
     170                RandValue = rand(ConeLimit, CylLimit);
    171171                break;
    172172            }
    173173            case 3:
    174174            {
    175                 RandValue = CylLimit + (int)(lol::RandF() * ((CapsLimit - CylLimit) - 1));
     175                RandValue = rand(CylLimit, CapsLimit);
    176176                break;
    177177            }
    178178            case 4:
    179179            {
    180                 RandValue = CapsLimit + (int)(lol::RandF() * ((MeshRand.Count() - CapsLimit) - 1));
     180                RandValue = rand(CapsLimit, MeshRand.Count());
    181181                break;
    182182            }
    183183            default:
    184184            {
    185                 RandValue = (int)(lol::RandF() * (MeshRand.Count() - 1));
     185                RandValue = rand(MeshRand.Count());
    186186            }
    187187        }
  • trunk/test/unit/build.cpp

    r2216 r2520  
    133133        double x, y;
    134134
    135         y = x = 1.0 + RandF(0.1f, 0.2f);
     135        y = x = 1.0 + rand(0.1f, 0.2f);
    136136        y += 4503599627370496.0;
    137137        /* The compiler should optimise this away */
     
    146146        double x, y;
    147147
    148         y = x = 1.0 + RandF(0.1f, 0.2f);
     148        y = x = 1.0 + rand(0.1f, 0.2f);
    149149        y += 4503599627370496.0;
    150150        FP_USE(y);
Note: See TracChangeset for help on using the changeset viewer.