/**
 * Jednoduchy random number generator. Sluzi len ako ukazka principu
 * funkcie generatora, pre prakticke pouzitie je to uz zastarala
 * koncepcia a neodporuca sa pouzivat
 * generuje pseudonahodne cisla rovnomerne rozdelene v intervale (0,1)
 */
public class Rndm {
  private static int seed = 1234567;
  private static final long mult = 69069;
  private static final long m =2147483647; //2^31 -1
  private static final double rescale = 1./(double)m;
  /**
   * Pri kazdom zavolani vrati dalsie pseudonahodne cislo zo sekvencie
   * nastartovanej hodnotou seed platnou pri prvom zavolani
   * @return double: hodnota generovaneho nahodneho cisla v intervale (0,1)
   */
  public static double rndm(){
    //calculates mult*seed  mod  m
    long tmp = mult*(long)seed;
    seed = (int)(tmp - (tmp/m)*m); //hodnota seed je vacia ako 0 a mensia ako m
    return seed*rescale;//preskalovanie; generovane cislo bude z inetrvalu (0,1)
  }
  /**
   * Nastvi novu hodnotu pre seed, teda startovacie cislo generatora, ktore
   * determinuje generovanu postupnost. Znovunastartovanie s rovnakou hodnotou
   * seed vygeneruje identicku postupnost pseudonahodnych cisel
   * @param s int: cislo, ktore sa pouzije ako seed pri generovany dalsich
   * clenov postupnosti
   */
  public static void setSeed(int s){
    seed = s;
  }
  /**
   * Vrati momentalne aktualnu hodnotu seed. Pri zastaveni generatora a jeho
   * znovunastartovani s touto hodnotou seed sa pokracuje v generovani
   * pseudonahodnej postupnosti ako keby k zastaveniu nebolo prislo
   * @return int: aktualna hodnota seed
   */
  public static int getSeed(){
    return (int)seed;
  }
  /**
   * Constructor je privatny, aby sa zabranilo vytvarat objekty tejto triedy.
   */
  private Rndm(){}
  }
