R/distributions.r

#We used linear random generator for generating random numbers.
#It was simple to impliment and if the parameter values are chosen carefully, the algorithm's accuracy can be really high.
#We used cc65 compiler parameters.
globals <- new.env()
max.random = 2 ** 32
globals$seed <- (as.double(Sys.time())) %% max.random

#seed = (as.integer(Sys.time())) %% max.random

rgenerator <- function(count){
  arr <- c(globals$seed)
  if(count != 1){
    for(i in 2:count){
      arr[i] <- (16843009 * arr[i-1] + 826366247) %% max.random
    }
  }
  globals$seed <- ((16843009 * arr[count] + 826366247) %% max.random)
 # seed <<- ((16843009 * arr[count] + 826366247) %% max.random)
  return(arr)
}

dugen <- function(n,a,b){
  return((rgenerator(n) / max.random) * (b-a) + a)
}

cugen <-function(n){
  return(dugen(n,0,1))
}

brgen <- function(n, p)
{
  random = cugen(n)
  a = c()
  for (i in random){
    if(i < p)
    {
      a = append(a, 1)
    }
    else
    {
      a = append(a, 0)
    }
  }
  return(a)
}

bigen <- function(count, n, p){
  result = c()
  for(i in 1:count){
    #result = append(result, sum(brgen(n, p)))
    result[i] = sum(brgen(n, p))
  }
  return(result)
}

gegen <- function(n, p)
{
  ret = c()
  for(i in 1:n){
    result = 0
    while(!brgen(1, p))
    {}
    while(!brgen(1, p))
    {
      result = result + 1
    }
    ret[i] = result
  }
  return(ret)
}

expgen <- function(n, lambda){
  return(-1*log(cugen(n)) / lambda)
}

gagen <- function(n, lambda , k){
  result = c()
  for (i in 1:n){
    result[i] = sum(expgen(k, lambda))
  }
  return(result)
}

pogen <- function(n, lambda, t){
  result = c()
  for(i in 1:n){
    time = 0
    num = 0
    while(TRUE){
      time = time + expgen(1, lambda)
      if(time > t){
        break
      }
      num = num + 1
    }
    result[i] = num
  }
  return(result)
}

nogen <- function(n, u, s){
  po = pogen(n, s, 1)
  po = po - (s - u)
  return(po)
}
mo-mahdavi/RandomGenerator documentation built on May 17, 2019, 4:33 p.m.