130 lines
4.8 KiB
C++
130 lines
4.8 KiB
C++
//========= Copyright Valve Corporation, All rights reserved. ============//
|
|
//
|
|
// Purpose: Random number generator
|
|
//
|
|
// $Workfile: $
|
|
// $NoKeywords: $
|
|
//===========================================================================//
|
|
|
|
#ifndef VSTDLIB_RANDOM_H
|
|
#define VSTDLIB_RANDOM_H
|
|
|
|
#include "../tier0/basetypes.h"
|
|
#include "../tier0/threadtools.h"
|
|
#include "../tier1/interface.h"
|
|
#include "vstdlib.h"
|
|
|
|
#define NTAB 32
|
|
|
|
#pragma warning(push)
|
|
#pragma warning(disable : 4251)
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// A generator of uniformly distributed random numbers
|
|
//-----------------------------------------------------------------------------
|
|
class VSTDLIB_CLASS IUniformRandomStream {
|
|
public:
|
|
// virtual ~IUniformRandomStream() { }
|
|
|
|
// Sets the seed of the random number generator
|
|
virtual void SetSeed(int iSeed) = 0;
|
|
|
|
// Generates random numbers
|
|
virtual float RandomFloat(float flMinVal = 0.0f, float flMaxVal = 1.0f) = 0;
|
|
virtual int RandomInt(int iMinVal, int iMaxVal) = 0;
|
|
virtual float RandomFloatExp(float flMinVal = 0.0f, float flMaxVal = 1.0f,
|
|
float flExponent = 1.0f) = 0;
|
|
};
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// The standard generator of uniformly distributed random numbers
|
|
//-----------------------------------------------------------------------------
|
|
class VSTDLIB_CLASS CUniformRandomStream : public IUniformRandomStream {
|
|
public:
|
|
CUniformRandomStream();
|
|
|
|
// Sets the seed of the random number generator
|
|
virtual void SetSeed(int iSeed);
|
|
|
|
// Generates random numbers
|
|
virtual float RandomFloat(float flMinVal = 0.0f, float flMaxVal = 1.0f);
|
|
virtual int RandomInt(int iMinVal, int iMaxVal);
|
|
virtual float RandomFloatExp(float flMinVal = 0.0f, float flMaxVal = 1.0f,
|
|
float flExponent = 1.0f);
|
|
|
|
private:
|
|
int GenerateRandomNumber();
|
|
|
|
int m_idum;
|
|
int m_iy;
|
|
int m_iv[NTAB];
|
|
|
|
CThreadFastMutex m_mutex;
|
|
};
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// A generator of gaussian distributed random numbers
|
|
//-----------------------------------------------------------------------------
|
|
class VSTDLIB_CLASS CGaussianRandomStream {
|
|
public:
|
|
// Passing in NULL will cause the gaussian stream to use the
|
|
// installed global random number generator
|
|
CGaussianRandomStream(IUniformRandomStream *pUniformStream = NULL);
|
|
|
|
// Attaches to a random uniform stream
|
|
void AttachToStream(IUniformRandomStream *pUniformStream = NULL);
|
|
|
|
// Generates random numbers
|
|
float RandomFloat(float flMean = 0.0f, float flStdDev = 1.0f);
|
|
|
|
private:
|
|
IUniformRandomStream *m_pUniformStream;
|
|
bool m_bHaveValue;
|
|
float m_flRandomValue;
|
|
|
|
CThreadFastMutex m_mutex;
|
|
};
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// A couple of convenience functions to access the library's global uniform
|
|
// stream
|
|
//-----------------------------------------------------------------------------
|
|
VSTDLIB_INTERFACE void RandomSeed(int iSeed);
|
|
VSTDLIB_INTERFACE float RandomFloat(float flMinVal = 0.0f,
|
|
float flMaxVal = 1.0f);
|
|
VSTDLIB_INTERFACE float RandomFloatExp(float flMinVal = 0.0f,
|
|
float flMaxVal = 1.0f,
|
|
float flExponent = 1.0f);
|
|
VSTDLIB_INTERFACE int RandomInt(int iMinVal, int iMaxVal);
|
|
VSTDLIB_INTERFACE float RandomGaussianFloat(float flMean = 0.0f,
|
|
float flStdDev = 1.0f);
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// IUniformRandomStream interface for free functions
|
|
//-----------------------------------------------------------------------------
|
|
class VSTDLIB_CLASS CDefaultUniformRandomStream : public IUniformRandomStream {
|
|
public:
|
|
virtual void SetSeed(int iSeed) OVERRIDE { RandomSeed(iSeed); }
|
|
virtual float RandomFloat(float flMinVal, float flMaxVal) OVERRIDE {
|
|
return ::RandomFloat(flMinVal, flMaxVal);
|
|
}
|
|
virtual int RandomInt(int iMinVal, int iMaxVal) OVERRIDE {
|
|
return ::RandomInt(iMinVal, iMaxVal);
|
|
}
|
|
virtual float RandomFloatExp(float flMinVal, float flMaxVal,
|
|
float flExponent) OVERRIDE {
|
|
return ::RandomFloatExp(flMinVal, flMaxVal, flExponent);
|
|
}
|
|
};
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Installs a global random number generator, which will affect the Random
|
|
// functions above
|
|
//-----------------------------------------------------------------------------
|
|
VSTDLIB_INTERFACE void InstallUniformRandomStream(
|
|
IUniformRandomStream *pStream);
|
|
|
|
#pragma warning(pop)
|
|
|
|
#endif // VSTDLIB_RANDOM_H
|