⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rng.c

📁 GBA游戏程序
💻 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 + -