X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=src%2Frandom.cc;fp=src%2Frandom.cc;h=22bbd4e615e2171047650c33b70c9c937065b378;hb=79b5f738f2e38acb60cda7e09f54802933a17105;hp=0000000000000000000000000000000000000000;hpb=a891a2dcbbb63d9e771da6efff00a33da614e737;p=chaz%2Fyoink diff --git a/src/random.cc b/src/random.cc new file mode 100644 index 0000000..22bbd4e --- /dev/null +++ b/src/random.cc @@ -0,0 +1,115 @@ + +/******************************************************************************* + + Copyright (c) 2009, Charles McGarvey + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +*******************************************************************************/ + +#include // srand, rand, RAND_MAX +#include // time +#include // log +#include // ULONG_MAX + +#include "random.hh" + + +namespace rng { + +unsigned seed(unsigned theSeed) +{ + srand(theSeed); + return theSeed; +} + +unsigned seed() +{ + return seed(time(0)); +} + + +template +T get() +{ + const float ln2 = 0.693147; + static const unsigned bitsPerPiece = std::log(float(RAND_MAX)) / ln2; + static const unsigned sizeOfType = sizeof(T) * 8; + static const unsigned pieces = sizeOfType / bitsPerPiece + + ((sizeOfType % bitsPerPiece) ? 1 : 0); + + T bits = 0; + + // we need to call rand() multiple times if it won't provide enough random + // bits to fill the size of the given type + for (unsigned i = 0; i < pieces; i++) + { + long piece = rand(); + bits |= piece << (i * bitsPerPiece); + } + + return bits; +} + + +template <> +bool get() +{ + return rand() % 2; +} + +template +T get(T lower, T upper) +{ + unsigned short randInt = get(); + return lower + T(randInt % (upper - lower + 1)); +} + +template <> +float get(float lower, float upper) +{ + unsigned long randInt = get(); + return (float(randInt) / float(ULONG_MAX)) * (upper - lower) + lower; +} + +template <> +double get(double lower, double upper) +{ + unsigned long long randInt = get(); + return (double(randInt) / double(ULLONG_MAX)) * (upper - lower) + lower; +} + +template <> +float get() +{ + return get(0.0, 1.0); +} + +template <> +double get() +{ + return get(0.0, 1.0); +} + + +}; // namespace rng +