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)
Untuk membangkitkan bilangan acak bernoulli dapat menggunakan 2 alternatif yaitu:
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")
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")
Untuk membangkitkan bilangan acak binomial dapat menggunakan 3 alternatif yaitu:
#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")
#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")
# 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
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)
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)
K <- 1
p <- 0.5
while(runif(1)>p)
K=K+1;
K
## [1] 2
output berupa satu bilangan acak dari sebaran geometrik.
# 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
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
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))
# 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
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")
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)
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)
# 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
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
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
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