Search code examples
rrandomdistribution

Generate random number from custom distribution


I am trying to generate random numbers from a custom distribution, i already found this question: Simulate from an (arbitrary) continuous probability distribution but unfortunatly it does not help me since the approach suggested there requires a formula for the distribution function. My distribution is a combination of multiple uniform distributions, basically the distribution function looks like a histogram. An example would be:

f(x) = { 
    0     for  x < 1
    0.5   for  1 <= x < 2
    0.25  for  2 <= x < 4
    0     for  4 <= x
}

Solution

  • You just need inverse CDF method:

    samplef <- function (n) {
      x <- runif(n)
      ifelse(x < 0.5, 2 * x + 1, 4 * x)
      }
    

    Compute CDF yourself to verify that:

    F(x) = 0                 x < 1
           0.5 * x - 0.5     1 < x < 2
           0.25 * x          2 < x < 4
           1                 x > 4
    

    so that its inverse is:

    invF(x) = 2 * x + 1      0 < x < 0.5
              4 * x          0.5 < x < 1