### Illustration of the linear congruential method.  pp67-68 Problem 72

 

# develop the algorithm to run the gnerator.

 

a <- 5

c <- 7

m <- 8

 

n <- 20      # number of random values to be generated

 

x <- numeric(n)

 

x[1] <- 4         # seed or x_0

 

for (i in 2:n){

      x[i] <- a*x[i-1]+c

      x[i] <- x[i] - trunc(x[i]/m)*m         # this calculates the remainder, i.e., calculates the mod
}

 

x

 

# Question:  What does m control in this random number generator?  Why should the value of m be large?

 

#############################################################################################################

 

# A function that generates psudo random uniform values using the linear congruential method.

 

RANU <- function(seed,n) {

      # a,c,m are the values need for the linear congruential method.

      # seed is the value of the seed for the random number generator.

      # n is the length of the vector returned.

 

      a <- 65539

      c <- 0

      m <- 2**31

 

      x <- numeric(n)        # creates the output vecotor of length n

      x[1] <- seed

      for (i in 2:n){

            x[i] <- a*x[i-1]+c

            x[i] <- x[i] - trunc(x[i]/m)*m         # this calculates the remainder, i.e., calculates the mod

      }

      x <- x/m                                 # dividing by m gives values between [0,1)
      return(x)

}

 

# A function that generates psudo random exponential values using the inverse cdf method.

 

RANDEXPO <- function(lam,seed,n){

      # lam is the scale parameter in the density. f(x) = lam*exp(-lam*x) x >= 0

      # seed is the value of the seed for the random number generator.

      # n is the length of the vector returned.

     

    u <- RANU(seed,n)            # creates a vector of random uniform values

    x <- -log(u)/lam              # creates the output vecotor of length n

      return(x)

}

 

### Illustration of the RANU.

 

seed <- 4

 

n <- 10000        # number of random values to be generated

 

u <- RANU(seed,n)

 

# plot a histogram

 

br <- seq(0,1,0.1)

 

hist(u,main='histogram of random uniform values',probability=T,breaks=br)

 

# make a scatter plot of pairs of values.

 

x <- u[1:trunc(n/2)]

y <- u[(trunc(n/2)+1):n]

 

plot(x,y,main='scatter plot of pairs of random uniform values')

 

### Illustration of RANDEXPO.

 

lambda <- 1

 

e <- RANDEXPO( lambda,seed,n)

 

hist(e,main='histogram of random exponential values',probability=T)

 

plot(e)