Pembangkitan Bilangan Acak

Pratama (2010) menyebutkan bahwa pembangkit bilangan acak atau Random Number Generator adalah suatu alat yang dapat membangkitkan bilangan secara acak. Pembangkit bilangan acak dibagi menjadi 2 jenis.

  1. Pembangkit bilangan acak sejati atau True Random Number Generator dimana bilangan acak yang dibangkitkan benar-benar merupakan bilangan acak.
  2. Pembangkit bilangan acak semu atau Psedo Random Number dimana bilangan yanag dibangkitkan tidak sepenuhnya acak.

Pembangkit Bilangan Acak Diskret

Pembangkit Bilangan Acak Seragam

Sebaran seragam merupakan sebaran yang paling sederhana sehingga sebaran yang lebih rumit dapat didekati dengan sebaran seragam.

\[ X_{n+1} = aX_n + b (mod\ m), n \ge0 \] dimana a,b, dan m adalah konstanta

\(X_0\) adalah nilai awal (seed)

b = 0, bentuk multiplikatif

b \(\neq\) 0, bentuk campuran

Bilangan acak U(0,1) dapat diperoleh dari X

\[ U_i = \frac{X_i}{m} \sim U(0,1) \]

Dengan menggunakan R studio ingin dibangkitkan 25 bilangan acak yang menyebar unifrom dengan a = 1234, b = 90, m = 10000, dan \(X_0\) = 80.

Syntax dibawah ini mendefinisikan fungsi lcg sebagai fungsi untuk membangkitkan bilangan acak uniform dengan nilai a,b,m,x0,dan n yang harus dimasukan.

lcg <- function(a, b, m, x0, n){
  matriks <- matrix(NA,n,3)
  colnames(matriks) <- c("aX(i-1)+b","Xi","Ui")
  for (i in 1:n){
    matriks[i,1] <- (a*x0+b)
    matriks[i,2] <- matriks[i,1]%%m
    matriks[i,3] <- matriks[i,2]/m
    x0 <- matriks[i,2]
  }
    print(matriks)
    hist(matriks[,3], main="Sebaran Uniform")
  }
a <- 1234
b <- 90
m <- 10000
x0 <- 80
n <- 25
lcg(a,b,m,x0,n)
##       aX(i-1)+b   Xi    Ui
##  [1,]     98810 8810 0.881
##  [2,]  10871630 1630 0.163
##  [3,]   2011510 1510 0.151
##  [4,]   1863430 3430 0.343
##  [5,]   4232710 2710 0.271
##  [6,]   3344230 4230 0.423
##  [7,]   5219910 9910 0.991
##  [8,]  12229030 9030 0.903
##  [9,]  11143110 3110 0.311
## [10,]   3837830 7830 0.783
## [11,]   9662310 2310 0.231
## [12,]   2850630  630 0.063
## [13,]    777510 7510 0.751
## [14,]   9267430 7430 0.743
## [15,]   9168710 8710 0.871
## [16,]  10748230 8230 0.823
## [17,]  10155910 5910 0.591
## [18,]   7293030 3030 0.303
## [19,]   3739110 9110 0.911
## [20,]  11241830 1830 0.183
## [21,]   2258310 8310 0.831
## [22,]  10254630 4630 0.463
## [23,]   5713510 3510 0.351
## [24,]   4331430 1430 0.143
## [25,]   1764710 4710 0.471

Dapat dilihat dari histogram diatas, 25 bilangan acak yang dibangkitkan menyebar seragam.

Pembangkitan Bilangan Acak Bernouli

Untuk membangkitkan bilangan acak bernoulli(p) dapat dibangkitkan dari sebaran uniform (0,1). Bilangan acak bernouli dapat dibangkitkan dengan membagi dua nilainya menjadi peluang sukses (Y=1) atau peluang gagal (Y=0). Selain itu, dapat dibangkitkan dengan fungsi kumulatif peluang suksesnya.

Syntax dibawah ini mendefinisikan fungsi bernoulli sebagai fungsi untuk membangkitkan bilangan acak bernoulli dengan nilai p sebagai peluang bernoulli dan i merupakan banyaknya bilangan acak yang akan dibangkitkan. Misal ingin dibangkitkan 25 bilangan acak yang menyebar bernoulli dengan peluang = 0.4

bernoulli <- function(p, i){
  U <- runif(i)
  Y <- NULL
  for(z in 1:i){
    ifelse(U[z]<=p, Y[z]<-1, Y[z]<-0)
    tabel <- table(Y)/length(Y)
  }
  barplot(tabel, main='Bernoulli')
}
bernoulli(p=0.4,i=25)

Dapat dilihat berdasarkan histogram diatas, 25 bilangan acak yang dibangkitkan menyebar bernoulli dengan fungsi massa peluang Y= 0 adalah 0.4 dan fungsi masaa peluang Y = 1 adalah 0.6.

Pembangkitan Bilangan Acak Binomial

Bilangan acak binomial dapat dibangkitkan dari sebaran unifrom langsung maupun dibangkitkan dari sebaran bernoulli. dapat dilihat seperti pada gambar dibawah ini.

Syntax dibawah ini mendefinisikan fungsi binomial sebagai fungsi untuk membangkitkan bilangan acak binomial dengan nilai p sebagai peluang, n banyaknya percobaan dan i merupakan banyaknya bilangan acak yang akan dibangkitkan. Misal ingin dibangkitkan 25 bilangan acak yang menyebar binomial dengan peluang = 0.4, dan banyaknya percobaan = 5.

binomial <- function(n, p, i){
  Binom<-NULL
  for (z in 1:i){
    m<-0
    for (k in 1:n){
      y<-(runif(1)<=p)+0
      m<-m+y
    }
    Binom[z]<-m
  }
  (tabel<-table(Binom)/length(Binom))
  barplot(tabel,main="Binomial")
}
binomial(5, 0.4, 25)

Dapat dilihat berdasarkan histogram diatas, 25 bilangan acak yang dibangkitkan menyebar bernoulli dengan fungsi massa peluang Y= 0 adalah 0.1, fungsi masaa peluang Y = 1 adalah 0.3, fungsi masaa peluang Y = 2 adalah 0.3, fungsi massa peluang Y = 3 adalah 0.2, dan seterusnya.

Pembangkitan Bilangan Acak Geometrik

Bilangan acak geometrik dapat dibangkitkan dari sebaran unifrom langsung maupun dibangkitkan dari sebaran bernoulli. dapat dilihat seperti pada gambar dibawah ini.

Syntax dibawah ini mendefinisikan fungsi geometrik sebagai fungsi untuk membangkitkan bilangan acak geometrik dengan nilai p sebagai parameter geometri atau peluang sukses dan i merupakan banyaknya bilangan acak yang akan dibangkitkan. Misal ingin dibangkitkan 25 bilangan acak yang menyebar geomterik dengan peluang sukses= 0.4

geometrik <- function(p, i){
  U <- runif(i)
  X <- log(1-U)/log(1-p)
  print(X)
  print(hist(X))
}

geometrik(0.4, 25)
##  [1] 0.25980872 0.57893331 0.24216047 2.18707323 0.73367958 0.46283212
##  [7] 0.79162195 0.70041426 0.35224347 3.26222668 0.23025985 1.51892690
## [13] 0.50250456 0.54538148 3.17237806 6.00426565 1.47652998 4.01032117
## [19] 2.66936129 1.07444062 3.13263517 1.88784076 0.08858926 4.28482351
## [25] 0.32741272

## $breaks
## [1] 0 1 2 3 4 5 6 7
## 
## $counts
## [1] 13  4  2  3  2  0  1
## 
## $density
## [1] 0.52 0.16 0.08 0.12 0.08 0.00 0.04
## 
## $mids
## [1] 0.5 1.5 2.5 3.5 4.5 5.5 6.5
## 
## $xname
## [1] "X"
## 
## $equidist
## [1] TRUE
## 
## attr(,"class")
## [1] "histogram"

Pembangkitan Bilangan Acak Binomial Negatif

Bilangan acak binomial negatif dapat dibangkitkan dari sebaran unifrom langsung maupun dibangkitkan dari sebaran geometrik. Dapat dilihat seperti pada gambar dibawah ini.

Syntax dibawah ini mendefinisikan fungsi binom_negatif sebagai fungsi untuk membangkitkan bilangan acak binomial negatif dengan nilai p sebagai parameter binomial negatif atau peluang sukses , r adalah banyaknya ulangan dan i merupakan banyaknya bilangan acak yang akan dibangkitkan. Misal ingin dibangkitkan 25 bilangan acak yang menyebar binomial negatif dengan peluang = 0.4.

binom_negatif <- function(p, r, i){
  U <- runif(i)
  neg_bin <- NULL
  F <- pnbinom(1:i, size=r, p)
  for (z in 1:i){
    neg_bin[z] <- min(which(U[z]<F))-1
  }
  table(neg_bin)
  barplot(table(neg_bin)/n)
  hist(table(neg_bin), main='Binomial negatif')
}
binom_negatif(p=0.4, r=5, i=50)

Pembangkitan Bilangan Acak Kontinu

Pembangkitkan Bilangan Acak Eksponensial

Bilangan acak eksponensial dapat dibangkitkan dari sebaran sebaran uniform. Syntax dibawah ini mendefinisikan fungsi eksponensial sebagai fungsi untuk membangkitkan bilangan acak eksponensial dengan nilai lambda sebagai parameter sebaran eksponensial ( lambda > 0) dan i merupakan banyaknya bilangan acak yang akan dibangkitkan. Misal ingin dibangkitkan 25 bilangan acak yang eksponensial dengan lambda=4 .

eksponensial <- function(lambda, i){
  U <- runif(i)
  X <- -log(1-U)/lambda
  hist(X, main='Eksponensial')
  return(X)
}
eksponensial(lambda=4, i=25)

##  [1] 0.140254499 0.246800858 0.554824153 0.087383342 0.155954554 0.010885210
##  [7] 0.835175890 0.082495184 0.166489504 0.008643213 0.025116007 0.967416573
## [13] 0.542828054 0.210236952 0.338089256 0.024185901 0.035432311 0.389602938
## [19] 0.118336496 0.194647004 0.847279617 0.227536006 0.095768781 0.755409549
## [25] 0.197516175

Pembangkitan Bilangan Acak Gamma

Bilangan acak gamma dapat dibangkitkan dari sebaran sebaran eksponensial yang dibangkitkan dari unifrom. Syntax dibawah ini mendefinisikan fungsi eksponensial dengan nilai lambda terlebih dahulu sebelum mendefinisikan fungsi gamma. Fungsi gamma merupakan fungsi untuk membangkitkan bilangan acak gamma dengan nilai lambda dan alpha sebagai parameter sebaran gamma dan i merupakan banyaknya bilangan acak yang akan dibangkitkan. Misal ingin dibangkitkan 25 bilangan acak yang menyebar gamma dengan alpha = 4 dan lambda = 3.

eksponensial <- function(lambda, i){
  U <- runif(i)
  X <- -log(1-U)/lambda
}
gamma <- function(alpha, lambda, i){
  eks <- matrix(eksponensial(lambda, alpha*i), i)
  G <- apply(eks,1,sum)
  hist(G, main='gamma')
  return(G)
}
gamma(alpha=4, lambda=3, i = 25)

##  [1] 0.8973727 1.7807720 0.7225973 1.1071340 1.0639583 0.7436353 0.8595154
##  [8] 1.3680963 0.7618805 1.1643781 1.0201954 0.4995921 4.0030534 0.6295462
## [15] 0.8282941 0.7578049 1.6151672 1.9580750 0.8183939 0.9170994 1.6491581
## [22] 0.8809408 1.2378594 1.3833009 0.4241271

Pembangkitan Bilangan Acak Chi- Square

Bilangan acak chi-square dapat dibangkitkan dari sebaran eksponensial yang dibangkitkan dari unifrom. Syntax dibawah ini mendefinisikan fungsi eksponensial dengan nilai lambda terlebih dahulu sebelum mendefinisikan fungsi gamma. Fungsi chisq merupakan fungsi untuk membangkitkan bilangan acak chi square dengan nilai alpha sebagai parameter sebaran chi square dan i merupakan banyaknya bilangan acak yang akan dibangkitkan. Misal ingin dibangkitkan 25 bilangan acak yang menyebar chi square dengan alpha = 3.

eksponensial <- function(lambda, i){
  U <- runif(i)
  X <- -log(1-U)/lambda
  return(X)
}
chisq <- function(alpha, i){
  eks <- matrix(eksponensial(2, alpha*i), i)
  chi <- apply(eks,1,sum)
  hist(chi, main='Chi square')
  return(chi)
}
chisq(alpha = 3,i = 25)

##  [1] 1.7566878 0.6826080 1.0604011 0.7875663 0.6978696 0.7034850 2.2559498
##  [8] 2.2317624 0.8816738 1.4629565 2.2500583 2.8956437 1.7244968 0.9228401
## [15] 1.7580258 2.1208519 1.1320995 2.2263548 0.7701339 2.8803515 1.2835349
## [22] 0.8966756 1.0197458 2.3966749 0.8789172