User Tools

Site Tools


openomf:random

Random.dat stuff

  DWORD g_something;
  BYTE g_randSeed1, g_randSeed2, g_randSeed3, g_randSeed4;
 
  void reinit_random_number_generator(unsigned int result)
  {
    char seed2 = g_randSeed2;
    if ( !(g_flags & 2) )
    {
      g_randSeed1 = result >> 1;
      g_randSeed3 = result >> 5;
      ++g_something;
      g_randSeed4 = result >> 3;
      seed2 = (BYTE)g_something + 3 * (BYTE)result;
      g_randSeed1 += 3 * (BYTE)g_something;
      g_randSeed4 += g_something >> 1;
      g_randSeed3 += 4 * (BYTE)g_something;
    }
    g_randSeed2 = seed2;
  }
 
  int random(int max)
  {
    static char table[256];
    static int initialized = 0;
 
    if ( !initialized )
    {
      int file = open("random.dat", 512);
      assert(file != -1, "ERROR random.dat not found\n");
      read(file, table, 256);
      close(file);
      initialized = 1;
    }
 
    int result;
    if ( max <= 255 )
    {
      result = max * (g_randomTable[g_randSeed1] ^ g_randomTable[g_randSeed2] ^ (unsigned int)g_randomTable[g_randSeed3]) >> 8;
    }
    else if ( max <= 65535 )
    {
      result = max * (((g_randomTable[g_randSeed3] ^ g_randomTable[g_randSeed1] ^ g_randomTable[g_randSeed4]) << 8) | g_randomTable[g_randSeed2] ^ g_randomTable[g_randSeed1] ^ (unsigned int)g_randomTable[g_randSeed3]) >> 16;
    }
    else
    {
      result = g_randomTable[g_randSeed4] ^ ((max >> 8) * (g_randomTable[g_randSeed3] ^ g_randomTable[g_randSeed1] ^ g_randomTable[g_randSeed2] | ((unsigned int)g_randomTable[g_randSeed4] << 8)) >> 16 << 8);
    }
    g_randSeed1 -= 2;
    g_randSeed2 += 1;
    g_randSeed3 += 3;
    g_randSeed4 += 7;
    return result;
  }
openomf/random.txt · Last modified: 2015/04/10 12:22 by 127.0.0.1