📄 rng.c
字号:
#include "rng.h"
unsigned long state[N+1]; // state vector + 1 extra to not violate ANSI C
unsigned long * next; // next random value is computed from here
s32 left; // can *next++ this many times before reloading
int do_regen;
void seedMT( unsigned long seed )
{
unsigned long x = (seed | 0x1 ) & 0xFFFFFFFF;
unsigned long * s = state;
unsigned long j = N;
left = 0;
*s++ = x;
while ( --j )
{
x *= 69069;
*s = ( x & 0xFFFFFFFF );
s++;
}
do_regen = 1;
}
unsigned long reloadMT()
{
unsigned long * p0 = state;
unsigned long * p2 = state + 2;
unsigned long * pM = state + M;
unsigned long s0;
unsigned long s1;
int j;
// if this is the first time through seed the algorithm.
if ( left < -1 ) seedMT( 4357U );
left = N-1;
next = &(state[1]);
for( s0 = state[0], s1 = state[1], j = ( N-M+1 ); --j; s0 = s1, s1 = *p2++ )
*p0++ = ( *pM++ ^ (mixBits(s0, s1) >> 1) ^ (loBit(s1) ? K : 0));
for( pM = state, j = M; --j; s0 = s1, s1 = *p2++ )
*p0++ = ( *pM++ ^ ( mixBits(s0, s1) >> 1 ) ^ ( loBit(s1) ? K : 0 ));
s1 = state[0];
*p0 = ( *pM ^ ( mixBits( s0, s1 ) >> 1 ) ^ ( loBit( s1 ) ? K : 0 ));
s1 ^= ( s1 >> 11 );
s1 ^= ( s1 << 7 ) & 0x9D2C5680U;
s1 ^= ( s1 << 15 ) & 0xEFC60000U;
return ( s1 ^ ( s1 >> 18 ));
}
unsigned long randomMT()
{
unsigned long y;
left--;
if ( left < 0 )
{
if ( do_regen == 1 )
{
return( reloadMT() );
} else {
left = N-1;
next = &(state[1]);
}
}
y = *next;
next++;
y ^= ( y >> 11 );
y ^= ( y << 7 ) & 0x9D2C5680;
y ^= ( y << 15 ) & 0xEFC60000;
y ^= ( y >> 18 );
return y;
}
// Add by Nokturn:
unsigned short Rand( unsigned short Range )
{
return ((unsigned short )randomMT() % Range);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -