#include <stdio.h>
#include <math.h>

#include "NombreAleatoireBasique.h"

NombreAleatoireBasique::NombreAleatoireBasique(void) {
  seed = 0;
}

NombreAleatoireBasique::NombreAleatoireBasique(unsigned long s) {
  seed = s;
}

void NombreAleatoireBasique::init(unsigned long s) {
  seed = s;
}

int NombreAleatoireBasique::rand(int limite) {
  seed = 0x015a4e35L * seed + 1 ;
  int lim =(seed>>8)&0x00FFFFFFL ;
  int quo = lim/limite ;
  if ( lim < 0 )
    quo-- ;
  return(lim-quo*limite);
}

long NombreAleatoireBasique::rand(long limite) {
  seed = 0x015a4e35L * seed + 1 ;
  long lim =(seed>>8)&0x00FFFFFFL ;
  long quo = lim/limite ;
  if ( lim < 0 )
    quo-- ;
  return(lim-quo*limite);
}

float NombreAleatoireBasique::rand(float limite) {
  long n = rand(8096L);
  return((float) n/8096*limite);
}

double NombreAleatoireBasique::rand(double limite) {
  long n = rand(8096L);
  return((double) n/8096*limite);
}

float NombreAleatoireBasique::rand(float limite,unsigned long sd) {
  seed = 0x015a4e35L * (sd+seed) + 1 ;
  long lim =(seed>>8)&0x00FFFFFFL ;
  long quo = lim/8096L ;
  if ( lim < 0 )
    quo-- ;
  long n = lim-quo*8096L;
  return((float) n/8096*limite);
}

double NombreAleatoireBasique::rand(double limite,unsigned long sd) {
  seed = 0x015a4e35L * (sd+seed) + 1 ;
  long lim =(seed>>8)&0x00FFFFFFL ;
  long quo = lim/8096L ;
  if ( lim < 0 )
    quo-- ;
  long n = lim-quo*8096L;
  return((double) n/8096*limite);
}

double NombreAleatoireBasique::rand(double limite,double sd) {
  long lseed =(long) (sd*11259.5);
  lseed = 0x015a4e35L * (lseed) + 1 ;
  long lim =(lseed>>8)&0x00FFFFFFL ;
  long quo = lim/8096L ;
  if ( lim < 0 )
    quo-- ;
  long n = lim-quo*8096L;
  return((double) n/8096*limite);
}

double NombreAleatoireBasique::rand_0_1(void)
  { double a =(double) rand(3200000)/3001 ;
    return(a-floor(a)) ;
}

NombreAleatoireBasique::~NombreAleatoireBasique(void) {
}

