xsi_random.h Source File
 
 
 
xsi_random.h
Go to the documentation of this file.
00001 //*****************************************************************************
00011 //*****************************************************************************
00012 
00013 #if (_MSC_VER > 1000) || defined(SGI_COMPILER)
00014 #pragma once
00015 #endif
00016 
00017 #ifndef __XSIRANDOM_H__
00018 #define __XSIRANDOM_H__
00019 
00020 #include "sicppsdk.h"
00021 #include <math.h>
00022 
00023 namespace XSI {
00024 
00025 namespace MATH {
00026 
00027 //*****************************************************************************
00036 //*****************************************************************************
00037 class SICPPSDKDECL CRandom
00038 {
00039         public:
00042         SICPPSDK_INLINE CRandom();
00043 
00047         SICPPSDK_INLINE CRandom( LONG in_nSeed );
00048 
00053         SICPPSDK_INLINE CRandom( const CRandom& in_random );
00054 
00056         ~CRandom() {}
00057 
00061         SICPPSDK_INLINE void PutSeed( LONG in_nSeed );
00062 
00066         SICPPSDK_INLINE LONG GetValue() const;
00067 
00071         SICPPSDK_INLINE float GetNormalizedValue() const;
00072 
00076         SICPPSDK_INLINE operator LONG () const;
00077 
00081         void PutIndex( ULONG in_nIndex );
00082 
00086         SICPPSDK_INLINE LONG operator++();
00087 
00091         SICPPSDK_INLINE LONG operator++(int);
00092 
00096         SICPPSDK_INLINE LONG operator--();
00097 
00101         SICPPSDK_INLINE LONG operator--(int);
00102 
00106         SICPPSDK_INLINE void Skip( ULONG in_nOffset );
00107 
00108         private:
00109         void Init( LONG in_nSeed, short in_nState, ULONG in_nStartIndex );
00110         LONG GetValue( LONG in_nIndex ) const;
00111         LONG GetNext( LONG in_nPrev );
00112         LONG GetPrevious( LONG in_nNext );
00113         static LONG Skip( LONG in_nValue, ULONG in_nOffset );
00114 
00115         static ULONG Map( LONG in_nUnmapped );
00116         static LONG Unmap( ULONG in_nMapped );
00117 
00118         mutable enum State
00119         {
00120                 HAVE_NONE,
00121                 HAVE_INDEX,
00122                 HAVE_INDEX_AND_RND
00123         } m_eState;
00124 
00125         LONG m_nSeed;
00126         ULONG m_nIndex;
00127         mutable LONG m_nRnd;
00128 };
00129 
00130 SICPPSDK_INLINE CRandom::CRandom()
00131 {
00132         Init( 0, HAVE_NONE, 0 );
00133 }
00134 
00135 SICPPSDK_INLINE CRandom::CRandom( LONG in_nSeed )
00136 {
00137         Init( in_nSeed, HAVE_NONE, 0 );
00138 }
00139 
00140 SICPPSDK_INLINE CRandom::CRandom( const CRandom& in_random )
00141 {
00142         m_nSeed = in_random.m_nSeed;
00143         m_eState = in_random.m_eState;
00144         m_nIndex = in_random.m_nIndex;
00145         m_nRnd = in_random.m_nRnd;
00146 }
00147 
00148 SICPPSDK_INLINE void CRandom::PutSeed( LONG in_nSeed )
00149 {
00150         m_nSeed = Map( 0 );
00151         PutIndex( in_nSeed + 12345 );
00152         m_nSeed = Map( GetValue() );
00153 }
00154 
00155 SICPPSDK_INLINE LONG CRandom::GetValue() const
00156 {
00157         if ( m_eState < HAVE_INDEX_AND_RND )
00158         {
00159                 m_nRnd = GetValue( m_nIndex );
00160                 m_eState = HAVE_INDEX_AND_RND;
00161         }
00162         return m_nRnd;
00163 }
00164 
00165 SICPPSDK_INLINE float CRandom::GetNormalizedValue() const
00166 {
00167         return (GetValue()/(float)(1<<30));
00168 }
00169 
00170 SICPPSDK_INLINE CRandom::operator LONG () const
00171 {
00172         return GetValue();
00173 }
00174 
00175 SICPPSDK_INLINE LONG CRandom::operator++()
00176 {
00177         ++m_nIndex;
00178         if ( m_eState >= HAVE_INDEX_AND_RND )
00179         {
00180                 return m_nRnd = GetNext( m_nRnd );
00181         }
00182         return GetValue();
00183 }
00184 
00185 SICPPSDK_INLINE LONG CRandom::operator++(int)
00186 {
00187         ++m_nIndex;
00188         int nTmp = GetValue();
00189         m_nRnd = GetNext( m_nRnd );
00190         return nTmp;
00191 }
00192 
00193 SICPPSDK_INLINE LONG CRandom::operator--()
00194 {
00195         --m_nIndex;
00196         if ( m_eState >= HAVE_INDEX_AND_RND )
00197         {
00198                 return m_nRnd = GetPrevious( m_nRnd );
00199         }
00200 
00201         return GetValue();
00202 }
00203 
00204 SICPPSDK_INLINE LONG CRandom::operator--(int)
00205 {
00206         --m_nIndex;
00207         LONG nTmp = GetValue();
00208         m_nRnd = GetPrevious( m_nRnd );
00209         return nTmp;
00210 }
00211 
00212 SICPPSDK_INLINE void CRandom::Skip( ULONG in_nOffset )
00213 {
00214         PutIndex( m_nIndex + in_nOffset );
00215 }
00216 
00217 };
00218 };
00219 
00220 #endif // __XSIRANDOM_H__