Back to Uniformly-distributed random numbers
#ifndef PASTELSYS_RANDOM_UNIFORM_HPP
#define PASTELSYS_RANDOM_UNIFORM_HPP
#include "pastel/sys/random/random_uniform.h"
#include "pastel/sys/random/random_integer.h"
namespace Pastel
{
    template <typename Real>
    Real random()
    {
        // Divided by 2^32 - 1
        return randomUint32() * ((Real)1.0 / (Real)4294967295.0); 
    }
    template <typename Real>
    Real randomOpen()
    {
        // Divided by 2^32
        return ((Real)randomUint32() + (Real)0.5) * 
            ((Real)1.0 / (Real)4294967296.0); 
    }
    template <typename Real>
    Real randomOpen0()
    {
        // Divided by 2^32
        return ((Real)randomUint32() + 1) * 
            ((Real)1.0 / (Real)4294967296.0); 
    }
    template <typename Real>
    Real randomOpen1()
    {
        // Divided by 2^32
        return randomUint32() * ((Real)1.0 / (Real)4294967296.0); 
    }
    template <typename Real>
    Real random53() 
    { 
        // These real versions are due to Isaku Wada, 2002/01/09.
        // Modified from the official Mersenne Twister source code.
        uint32 a = randomUint32() >> 5;
        uint32 b = randomUint32() >> 6; 
        return (a * (Real)67108864.0 + b) * 
            ((Real)1.0 / (Real)9007199254740992.0); 
    } 
    template <typename Real>
    Real random(
        const NoDeduction<Real>& minValue, 
        const NoDeduction<Real>& maxValue)
    {
        return minValue + Pastel::random<Real>() * (maxValue - minValue);
    }
    template <typename Real, integer N>
    Vector<Real, N> randomVector()
    {
        PASTEL_STATIC_ASSERT(N != Dynamic);
        return Pastel::randomVector<Real, N>(N);
    }
    template <typename Real, integer N>
    Vector<Real, N> randomVector(integer dimension)
    {
        PENSURE_OP(dimension, >=, 0);
        Vector<Real, N> direction(ofDimension(dimension));
        for (integer i = 0;i < dimension;++i)
        {
            direction[i] = random<Real>();
        }
        return direction;
    }
    template <typename Real>
    Real uniformPdf(
        const NoDeduction<Real>& x)
    {
        if (x < 0 || x > 1)
        {
            return 0;
        }
        return 1;
    }
    template <typename Real>
    Real uniformPdf(
        const NoDeduction<Real>& x,
        const NoDeduction<Real>& minValue,
        const NoDeduction<Real>& maxValue)
    {
        PENSURE_OP(minValue, <, maxValue);
        if (x < minValue || x > maxValue)
        {
            return 0;
        }
        return inverse(maxValue - minValue);
    }
}
#endif