#include <perms.h>

//          Edinburgh IMP77 Compiler - Version 8.4
//
//     1  !%endoflist
//     2  !These Pseudo-random numbers were written by P. Reid.  It is not known if
//     3  !they are genuinely random or not.
//     4
//     5  !**  %routine   INITALISE RANDOM    sets up the random integer SEED          **!
//     6  !**  %real %fn  RANDOM REAL (LO,HI) returns uniformly distributed reals      **!
//     7  !**                                 between LO and HI inclusive              **!
//     8  !**  %short %fn RANDOM INT (LO,HI)  returns uniformly distributed short      **!
//     9  !**                                 integers between LO and HI inclusive     **!
//    10
//    11  %own %integer Seed=0  {initialised to 0: JHB mod 16/12/86}

static int SEED = 0;

//    12
//    13
//    14  %routine Initialise Random

static void INITIALISERANDOM(void) {
  //    15  !
  //    16  ! Set up SEED
  //    17  !
  //    18     Seed = CpuTime

  SEED = _imp_CPUTIME();

  //    19  %end

  return;
} /* end of INITIALISERANDOM */

//    20
//    21
//    22  %realfn Random Real(%real Lo, Hi)

static float RANDOMREAL(float LO, float HI) {
  //    23  !
  //    24  ! Returns a random real between LO and HI inclusive
  //    25  !
  //    26     Seed = (23501*Seed + 6923) & 32767

  SEED = 23501 * SEED + 6923 & 32767;

  //    27     %result = Lo + (Seed * (Hi - Lo))/32767

  return LO + (double)((SEED * (HI - LO)) / 32767);

  //    28  %end

} /* end of RANDOMREAL */

//    29
//    30
//    31  %shortfn Random Int (%short Lo, Hi)

static short int RANDOMINT(short int LO, short int HI) {
  //    32  !
  //    33  ! Returns a random shortinteger between LO and HI inclusive
  //    34  !
  //    35     Seed = (23501*Seed + 6923) & 32767

  SEED = 23501 * SEED + 6923 & 32767;

  //    36     %result = Int(Lo + (Seed * (Hi - Lo))/32767)

  return _imp_INT(LO + (double)((SEED * (HI - LO)) / 32767));

  //    37  %end

} /* end of RANDOMINT */

//    38
//    39  !%list
//    40  %endoffile