Random Number Generator

Random number generator (RNG) merupakan algoritma untuk menghasilkan sequence dari angka sebagai hasil perhitungan dengan komputer yang diketahui distribusinya sehingga angka muncul secara acak.

Tidak ada komputasi yang benar-benar menghasilkan deret bilangan acak secara sempurna karena bilangan acak yang dibangkitkan adalah bilangan semu (pseudo random number). Pseudo random number memiliki sifat independent, uniform, dense, dan efficient.

Penentuan random number dapat dilakukan dengan tabel random number, electronic random number, dan congruential pseudo random number generator seperti Linear Congruential Generator (LCG), Multiplicative Random Number Generator, dan Mixed Congruential Random Number Generator.

Aplikasi di RStudio:

Misal a = 1698, b = 16, m = 1000, dan x0 = 88

x0<-88
n<-250
xi<-matrix(NA,n,3)
colnames(xi)<-c("aX(i-1)+b","Xi","Ui")
for (i in 1:n)
{
 xi[i,1]<-(1698*x0+16)
 xi[i,2]<-xi[i,1]%%1000
 xi[i,3]<-xi[i,2]/1000
 x0<-xi[i,2]
}
hist(xi[,3])

Contoh: jika Y ~ U(3, 20)

x <- runif(1000, 0, 1)
Y <- (20-3)*x+3
hist(Y)

Pembangkitan Bilangan Acak Diskret

Peubah Acak Bernoulli

Untuk membangkitkan bilangan acak bernoulli dapat menggunakan 2 alternatif yaitu:

  1. dengan membagi 2 nilainya menjadi (1 dan 0) berdasarkan peluang suksesnya seperti pada skema pembangkitan di bagian kanan.
i<-1000
p<-.75
X<-runif(i)
Y<-NULL
for (z in 1:i) ifelse (X[z]<=p,Y[z]<-1,Y[z]<-0)
(tabel<-table(Y)/length(Y))
## Y
##     0     1 
## 0.222 0.778
barplot(tabel,main="Bernoulli")

  1. dengan fungsi kumulatif peluang suksesnya seperti pada skema pembangkitan di bagian kiri.
i<-1000
p<-.65
X<-runif(i)
Y<-(X<=p)+0
(tabel<-table(Y)/length(Y))
## Y
##     0     1 
## 0.356 0.644
barplot(tabel,main="Bernoulli")

Peubah Acak Binomial

Untuk membangkitkan bilangan acak binomial dapat menggunakan 3 alternatif yaitu:

  1. Pembangkitan dari bilangan acak bernoulli
#Binomial (5,0.65)
i<-1000
n<-5
p<-0.65
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))
## Binom
##     0     1     2     3     4     5 
## 0.007 0.046 0.186 0.335 0.311 0.115
barplot(tabel,main="Binomial")

  1. Pembangkitan dari bilangan acak uniform
#Binomial (3,0.5)
i<-1000
X<-runif(i)
Binom<-
as.numeric(cut(X,breaks=c(0,1/8,4/8,7/8,1),include.lowest = 
T))-1
(tabel<-table(Binom)/length(Binom))
## Binom
##     0     1     2     3 
## 0.128 0.385 0.367 0.120
barplot(tabel,main="Binomial")

  1. Pembangkitan dengan menggunakan fungsi di R
# x ~ binom(4, 0.5) sebanyak 16 bilangan acak
x <- rbinom(16, 4, 0.5)
x
##  [1] 2 1 1 3 3 2 2 1 2 4 4 2 1 2 1 1

Peubah Acak Geometrik

Untuk membangkitkan bilangan acak geometrik dapat menggunakan beberapa alternatif yaitu:

1. dengan fungsi inverse transformation method

i<- 1000
p<-0.5
R<-runif(i)
X<-log(1-R)/log(1-p)
hist(X)

  1. dengan input nilai p (peluang sukses)
i <- 100
sebaran_geom <- function(p){
 R <- runif(i)
 X <- log(1-R)/log(1-p)
 print(X)
}
sebaran_geom(0.5)
##   [1] 2.016710792 3.050288502 0.146518595 0.546230390 0.969807844 4.787001615
##   [7] 2.275559112 2.030511796 0.757866411 0.606230841 0.600331400 1.292244623
##  [13] 1.373606706 0.151429691 0.963557574 1.859308687 0.481323578 1.653434400
##  [19] 1.423015474 0.673606277 1.690010729 0.107709727 0.006311126 2.283221926
##  [25] 0.600335571 0.713496453 1.102055420 1.367183675 0.052102084 3.837788846
##  [31] 0.993595081 0.311003079 0.100550817 0.244218672 1.127084001 0.293839961
##  [37] 2.639250684 3.170598868 0.907702592 2.468197608 5.208302681 0.201831361
##  [43] 3.759000662 0.841950481 0.292192847 0.572272521 0.063224153 0.409671734
##  [49] 1.486475459 0.653368403 0.992991215 1.679655588 0.653277468 0.644025637
##  [55] 0.191581386 0.368154814 2.566080998 1.306972807 2.614631552 0.202685377
##  [61] 0.299304831 0.269543147 0.515793968 0.648654091 6.609631523 4.968645087
##  [67] 0.101884581 0.007436239 1.417592676 0.579386862 0.857843666 0.519662243
##  [73] 0.857672694 0.734045687 2.988233287 0.134516040 1.060847299 0.745951406
##  [79] 0.717830800 1.234443536 2.630181404 1.436084692 3.225148468 2.404674761
##  [85] 0.151971891 0.427399705 1.414082227 2.829255989 2.056722942 1.242279233
##  [91] 0.534753000 0.480384458 2.000650476 0.170889209 1.694728318 0.412898566
##  [97] 0.690585948 7.598316048 2.099161655 3.221183267
hist(X)

  1. dengan melalui sebaran bernoulli
K <- 1
p <- 0.5
while(runif(1)>p)
 K=K+1;
K
## [1] 2

output berupa satu bilangan acak dari sebaran geometrik.

  1. dengan menggunakan fungsi di R
# x ~ geometrik(0.4) sebanyak 16 bilangan acak
x <- rgeom(16, 0.4)
x
##  [1] 1 0 0 1 4 0 2 3 0 3 0 0 2 4 1 0

Peubah Acak Binomial Negatif

Untuk membangkitkan bilangan acak binomial negatif dapat menggunakan 3 alternatif yaitu:

1. dengan melalui sebaran geometrik

K <- 1
p <- 0.5
r <- 3
R <-runif(i)
s <-0
while(s < r){
 if (runif(1)>p)
 {K = K+1;
 print=0
 }
 else
 {s = s+1;
 print = 1}
}
K+r-1
## [1] 11
  1. dengan melalui sebaran uniform
n<-1000
U<- runif(n)
m<- 5
p<- 0.5
F<-pnbinom(1:20,size = m,p)
negative.binom <- NULL
for (i in 1:n){
 negative.binom[i]<- min(which(U[i]<F))-1
}
table(negative.binom)
## negative.binom
##   0   1   2   3   4   5   6   7   8   9  10  11  12  13  14  15  16  17 
## 111  98 133 155 122  99  75  61  46  28  20  18  12   7   6   4   4   1
barplot(table(negative.binom)/n)

hist(table(negative.binom))

  1. dengan menggunakan fungsi di R
# x ~ negative binom(4,0.5) sebanyak 16 bil. acak
x <- rnbinom(16,4,0.5)
x
##  [1]  5 11  3  5  2  6  3  4  6  5  3  1  1  0  4  5

Peubah Acak Seragam

untuk membangkitkan bilangan acak uniform diskret dapat dilakukan dengan syntax berikut.

i<-1000
N<-4
X<-runif(i)
DU<-NULL
for (z in 1:i){
if (X[z]<=1/N) DU[z]<-1
else if (X[z]<=2/N) DU[z]<-2
else if (X[z]<=3/N) DU[z]<-3
else DU[z]<-4
}
(tabel<-table(DU)/length(DU))
## DU
##     1     2     3     4 
## 0.251 0.246 0.263 0.240
barplot(tabel,main="Seragam Diskret")

Peubah Acak Poisson

Untuk membangkitkan bilangan acak poisson dapat menggunakan 3 alternatif yaitu:

1. dengan melalui sebaran uniform

i<-100
lambda<-1
K<-NULL
for (z in 1:i){
k<-0
sk<-1
while(sk>=exp(-lambda)){
u<-runif(1)
sk<-sk*u
k<-k+1
}
K[z]<-k
}
K
##   [1] 3 2 1 1 2 2 2 1 2 2 1 4 1 1 1 4 3 3 2 2 1 2 2 1 5 2 3 3 3 3 2 2 1 2 3 2 2
##  [38] 4 2 2 2 1 2 1 1 2 2 1 2 2 1 4 1 1 2 2 3 3 2 2 2 1 1 2 2 2 3 1 4 3 2 2 2 3
##  [75] 2 1 1 3 1 3 1 1 1 1 1 2 1 1 3 1 2 1 1 3 3 1 1 3 1 4
(tabel1<-table(K)/length(K))
## K
##    1    2    3    4    5 
## 0.36 0.38 0.19 0.06 0.01
barplot(tabel1)

  1. dengan melalui sebaran eksponensial
i<-100
lambda<-1
K<-NULL
for (z in 1:i){
sk<-0
k<-0
while (sk<=1){
u<-runif(1)
y<--log(u)/lambda
sk<-y+sk
k<-k+1
}
K[z]<-k-1
}
K
##   [1] 0 1 2 0 0 0 2 2 1 1 2 0 0 1 1 2 1 0 1 1 1 1 0 0 1 1 0 0 0 0 1 3 0 1 0 1 0
##  [38] 1 1 3 2 1 2 4 3 0 1 1 1 3 4 1 2 0 3 3 1 2 3 2 3 2 2 1 1 2 0 3 1 0 1 2 0 0
##  [75] 1 1 1 1 0 0 0 1 0 0 0 0 0 2 2 1 0 2 4 0 2 2 2 0 0 1
(tabel2<-table(K)/length(K))
## K
##    0    1    2    3    4 
## 0.34 0.34 0.20 0.09 0.03
barplot(tabel2)

  1. dengan menggunakan fungsi di R
# x ~ poisson(4) sebanyak 16 bilangan acak
x <- rpois(16, 4)
x
##  [1] 9 4 3 3 6 1 4 7 4 4 6 7 7 4 2 6

Pembangkitan Bilangan Acak Sebaran Kontinu

Peubah Acak Eksponensial

untuk membangkitkan bilangan acak eksponensial dapat dilakukan dengan syntax berikut.

#Eksponensial(λ=4)
i<-1000
lambda<-4
U<-runif(i)
X<--log(U)/lambda
hist(X)

dengan menggunakan fungsi di R dapat dibangkitkan bilangan acak eksponensial sebagai berikut.

# x ~ eksponensial (4) sebanyak 16 bilangan acak
x <- rexp(16, 4)
x
##  [1] 0.27540578 0.08725896 0.14606611 0.01128606 0.38753884 0.03614154
##  [7] 0.09378070 0.07514166 0.33875898 0.30727792 0.32948250 0.30238797
## [13] 0.01607713 0.19283773 0.18186626 0.23375910

Peubah Acak Gamma

untuk membangkitkan bilangan acak gamma dapat dilakukan dengan syntax berikut.

#Gamma(α=4,β=3)
i<-1000
lambda<-3
alpha<-4
U<-log(runif(i*alpha))
Um<-matrix(U,i)
Y<-apply(Um,1,sum)
Gamma<--Y/lambda
hist(Gamma)

dengan menggunakan fungsi di R dapat dibangkitkan bilangan acak gamma sebagai berikut.

# x ~ gamma(4,3) sebanyak 16 bilangan acak
x <- rgamma(16, 4, 3)
x
##  [1] 1.1982460 0.7016608 2.6252732 1.9455416 2.4538377 1.9493011 1.4011062
##  [8] 1.6030913 0.3284168 1.6226204 0.8537070 0.5542823 1.1488936 0.7070990
## [15] 1.3294950 1.4108307

Peubah Acak Chi-Square

untuk membangkitkan bilangan acak chi-square genap dapat dilakukan dengan syntax berikut.

#chi-square(10)
i<-1000
lambda<-2
alpha<-5
U<-log(runif(i*alpha))
Um<-matrix(U,i)
Y<-apply(Um,1,sum)
chi<--Y/lambda
hist(chi)

untuk membangkitkan bilangan acak chi-square ganjil dapat dilakukan dengan syntax berikut.

#chi-square(11)
i<-1000
lambda<-2
alpha<-5
U<-log(runif(i*alpha))
Um<-matrix(U,i)
Y<-apply(Um,1,sum)
chi<--Y/lambda
chi<-chi+(rnorm(i))^2
hist(chi)

dengan menggunakan fungsi di R dapat dibangkitkan bilangan acak chi-square sebagai berikut.

# x ~ chisquare(11) sebanyak 16 bilangan acak
x <- rchisq(16,11)
x
##  [1] 21.575308  3.415943 12.150315  9.733835 12.627405  6.101933 18.417760
##  [8] 13.204497  6.663218 20.301579 12.229026 17.478204  5.863032 14.664741
## [15] 11.164580  9.192932

url rpubs: https://rpubs.com/annissanff/laporan1stk473