1. E[X^2] untuk X ~ U(0,1)

set.seed(1)
x <- runif(10000)
EX2 <- mean(x^2)
EX2
## [1] 0.3348666

2. Simulasi dari N(100, 15^2) untuk n = 100, 1000, 10000

set.seed(2)
n_values <- c(100, 1000, 10000)
results <- lapply(n_values, function(n) {
  data <- rnorm(n, mean = 100, sd = 15)
  list(mean = mean(data), sd = sd(data), data = data)
})

par(mfrow = c(1, 3))
for (i in 1:3) {
  hist(results[[i]]$data, main = paste("n =", n_values[i]), col = "lightblue", breaks = 20)
}

3. Simulasi Binomial Bin(30, 0.25)

set.seed(3)
binomial_samples <- rbinom(5000, size = 30, prob = 0.25)
mean(binomial_samples >= 15)
## [1] 0.0016

4. Fungsi Rumus S

rumus_s <- function(x) {
  n <- length(x)
  sqrt((sum(x^2) - (sum(x)^2)/n)/(n - 1))
}

set.seed(4)
data <- rnorm(1000, mean = 89, sd = 10)
rumus_s(data)
## [1] 9.693035

5. Simulasi Antrian di Bank

a. Simulasi 2 Teller selama 20 Hari

simulasi_bank <- function(n_teller = 2, hari = 20) {
  bank <- simmer("Bank")
  customer <- trajectory("nasabah") %>%
    seize("teller", 1) %>%
    timeout(function() rexp(1, rate = 1/8)) %>%
    release("teller", 1)
  
  bank %>%
    add_resource("teller", capacity = n_teller) %>%
    add_generator("nasabah", customer, function() rexp(1, 1/12)) %>%
    run(until = hari * 60 * 6)
  
  return(bank)
}

bank_sim <- simulasi_bank(2, 20)

b. Rata-rata Waktu Tunggu

get_mon_arrivals(bank_sim) %>% 
  mutate(waktu_tunggu = end_time - start_time - activity_time) %>%
  summarise(rata2_waktu_tunggu = mean(waktu_tunggu))
##   rata2_waktu_tunggu
## 1           1.085676

c. Persentase Teller Sibuk

res <- get_mon_resources(bank_sim)
res_teller <- res %>% filter(resource == "teller")
res_teller %>% summarise(utilisasi = mean(server / capacity) * 100)
##   utilisasi
## 1  54.04504

d. Bandingkan dengan 3 Teller

bank_sim3 <- simulasi_bank(3, 20)
res3 <- get_mon_resources(bank_sim3)
res3_teller <- res3 %>% filter(resource == "teller")
res3_teller %>% summarise(utilisasi = mean(server / capacity) * 100)
##   utilisasi
## 1  36.45922

e. Grafik Panjang Antrian

library(ggplot2)

res_queue <- get_mon_resources(bank_sim) %>%
  filter(resource == "teller")

ggplot(res_queue, aes(time, queue)) +
  geom_line(color = "steelblue") +
  labs(title = "Panjang Antrian Teller Sepanjang Hari",
       x = "Waktu (menit)",
       y = "Jumlah dalam Antrian")

6. Simulasi Toko Kelontong Bu Sari

a–b. Simulasi 60 Hari dan Hitung Kehabisan Stok

simulasi_stok <- function(hari = 60, stok_awal = 100, pesanan = 50, frekuensi = 5) {
  stok <- numeric(hari)
  stok[1] <- stok_awal
  kehabisan <- 0
  
  for (i in 2:hari) {
    penjualan <- sample(8:15, 1)
    stok[i] <- stok[i - 1] - penjualan
    
    if (i %% frekuensi == 0) {
      stok[i] <- stok[i] + pesanan
    }
    
    if (stok[i] < 0) {
      kehabisan <- kehabisan + 1
      stok[i] <- 0
    }
  }
  
  return(list(stok = stok, kehabisan = kehabisan))
}

hasil <- simulasi_stok()
plot(hasil$stok, type = 'l', main = "Stok Beras Selama 60 Hari", ylab = "Stok", xlab = "Hari")

hasil$kehabisan
## [1] 0

c. Strategi Jumlah Pemesanan

strategi <- c(40, 50, 60)
sapply(strategi, function(p) simulasi_stok(pesanan = p)$kehabisan)
## [1] 16  5  0

d. Frekuensi Pemesanan Berbeda

frekuensi <- c(3, 5, 7)
sapply(frekuensi, function(f) simulasi_stok(frekuensi = f)$kehabisan)
## [1]  0  2 18

e. Grafik Strategi Optimal + Rekomendasi

stok_opt <- simulasi_stok(pesanan = 60, frekuensi = 5)
plot(stok_opt$stok, type = 'l', col = 'darkgreen', lwd = 2,
     main = "Grafik Stok Beras Bu Sari (Strategi Optimal)",
     xlab = "Hari ke-", ylab = "Jumlah Stok Karung")
abline(h = 0, col = "red", lty = 2)

Rekomendasi Bu Sari

Bu Sari sebaiknya memesan 60 karung setiap 5 hari karena strategi ini: - Minim kehabisan stok (kerugian minim). - Tidak terlalu sering memesan (efisien logistik). - Menjaga stok stabil dan aman selama 60 hari.