5# define cut( a ) ( (a)&0xffffffff )
10#define ind( mm, x ) ( ( mm )[ ( x >> 2 ) & ( RANDSIZ - 1 ) ] )
12#define rngstep( mix, a, b, mm, m, m2, r, x ) \
15 a = cut( ( a ^ ( mix ) ) + *( m2++ ) ); \
16 *( m++ ) = y = cut( ind( mm, x ) + a + b ); \
17 *( r++ ) = b = cut( ind( mm, y >> RANDSIZL ) + x ); \
20#define mix( a, b, c, d, e, f, g, h ) \
48#define shuffle( a, b, mm, m, m2, r, x ) \
50 rngstep( a << 13, a, b, mm, m, m2, r, x ); \
51 rngstep( a >> 6, a, b, mm, m, m2, r, x ); \
52 rngstep( a << 2, a, b, mm, m, m2, r, x ); \
53 rngstep( a >> 16, a, b, mm, m, m2, r, x ); \
68 TUINT a, b, x, y, *m, *mm, *m2, *r, *mend;
72 b =
cut( m_uiRandB + ( ++m_uiRandC ) );
75 mend = m2 = m + (
RANDSIZ / 2 );
78 shuffle( a, b, mm, m, m2, r, x );
84 shuffle( a, b, mm, m, m2, r, x );
92void TRandom::RandInit()
97 m_uiRandA = m_uiRandB = m_uiRandC = 0;
100 a = b = c = d = e = f = g = h = 0x9e3779b9 + m_uiSeed;
105 mix( a, b, c, d, e, f, g, h );
112 for ( i = 0; i <
RANDSIZ; i += 8 )
123 mix( a, b, c, d, e, f, g, h );
136 for ( i = 0; i <
RANDSIZ; i += 8 )
147 mix( a, b, c, d, e, f, g, h );
165 TASSERT( a_iUpper > a_iLower,
"a_iLower can't be higher than a_iUpper" );
167 unsigned long long rand =
RandRaw();
168 unsigned long long range = a_iUpper - a_iLower;
169 return a_iLower + ( range * rand >> 32 );
175 return GetInt( 0, a_iUpper );
185 return (
RandRaw() >> 1 ) * 4.6566129E-10f;
191 return (
TFLOAT)(
RandRaw() >> 1 ) * 4.6566129E-10f * ( a_fUpper - a_fLower ) + a_fLower;
196 return (
RandRaw() >> 1 ) * 9.3132257E-10f * -1.0f;
207 if ( ( m_uiRndCnt-- ) != 0 )
209 return m_pRandrsl[ m_uiRndCnt ];
214 return m_pRandrsl[
RANDSIZ - 1 ];
#define shuffle(a, b, mm, m, m2, r, x)
#define mix(a, b, c, d, e, f, g, h)
#define TOSHI_NAMESPACE_START
#define TOSHI_NAMESPACE_END
void SetSeed(TUINT a_uiSeed)
TFLOAT GetFloatMinMax(TFLOAT a_fLower, TFLOAT a_fUpper)