mirror of
https://github.com/celisej567/source-engine.git
synced 2026-01-04 18:09:53 +03:00
1
This commit is contained in:
123
public/vstdlib/random.h
Normal file
123
public/vstdlib/random.h
Normal file
@@ -0,0 +1,123 @@
|
||||
//========= Copyright Valve Corporation, All rights reserved. ============//
|
||||
//
|
||||
// Purpose: Random number generator
|
||||
//
|
||||
// $Workfile: $
|
||||
// $NoKeywords: $
|
||||
//===========================================================================//
|
||||
|
||||
#ifndef VSTDLIB_RANDOM_H
|
||||
#define VSTDLIB_RANDOM_H
|
||||
|
||||
#include "vstdlib/vstdlib.h"
|
||||
#include "tier0/basetypes.h"
|
||||
#include "tier0/threadtools.h"
|
||||
#include "tier1/interface.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
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user