normal_baku <- function(n) {
 mu = 0
 sigma =1
  u1 <- runif(n, 0, 1)
 u2 <- runif(n, 0, 1)
 z1 <- (sqrt(-2 * log(u1))) * cos(2 * pi * u2)
 z2 <- (sqrt(-2 * log(u1))) * sin(2 * pi * u2)
 z <- c(z1, z2)
 x=mu+(sigma*z)
 return(x)
}
stat <- function(data) {
 z_mean <- mean(data)
 z_var <- var(data)
 return(list(mean = z_mean, variance = z_var))
}
plot_histogram <- function(data) {
 hist(data, breaks = 30, col = "pink", main = "Histogram of Generated N(0,1)",
 xlab = "Generated Values", border = "white")
}
library(moments)
## Warning: package 'moments' was built under R version 4.3.1
set.seed(100)

# 1. Bangkitkan data normal baku
data <- rnorm(1000, mean = 0, sd = 1)
data[1:50]
##  [1] -0.50219235  0.13153117 -0.07891709  0.88678481  0.11697127  0.31863009
##  [7] -0.58179068  0.71453271 -0.82525943 -0.35986213  0.08988614  0.09627446
## [13] -0.20163395  0.73984050  0.12337950 -0.02931671 -0.38885425  0.51085626
## [19] -0.91381419  2.31029682 -0.43808998  0.76406062  0.26196129  0.77340460
## [25] -0.81437912 -0.43845057 -0.72022155  0.23094453 -1.15772946  0.24707599
## [31] -0.09111356  1.75737562 -0.13792961 -0.11119350 -0.69001432 -0.22179423
## [37]  0.18290768  0.41732329  1.06540233  0.97020202 -0.10162924  1.40320349
## [43] -1.77677563  0.62286739 -0.52228335  1.32223096 -0.36344033  1.31906574
## [49]  0.04377907 -1.87865588
# 2. Definisikan fungsi hitung mean & varian
calculate_statistics <- function(x) {
  data.frame(
    mean = mean(x),
    variance = var(x)
  )
}

# 3. Hitung mean dan varian
stats <- calculate_statistics(data)
cat("Mean:", stats$mean, "\n")
## Mean: 0.01680509
cat("Variance:", stats$variance, "\n")
## Variance: 1.062112
# 4. Fungsi buat histogram
plot_histogram <- function(x) {
  hist(x, main = "Histogram", xlab = "Value", col = "pink", border = "white")
}

# 5. Plot histogram
plot_histogram(data)

normal_baku <- function(n) {
 mu = 10
 sigma = 2
 u1 <- 0.5
 u2 <- 0.7
 z1 <- (sqrt(-2 * log(u1))) * cos(2 * pi * u2)
 z2 <- (sqrt(-2 * log(u1))) * sin(2 * pi * u2)
 z <- c(z1, z2)
 x = mu+(sigma*z)
 return(x)
}
calculate_statistics <- function(data) {
 z_mean <- mean(data)
 z_var <- var(data)
 return(list(mean = z_mean, variance = z_var))
}
plot_histogram <- function(data) {
 hist(data, breaks = 30, col = "pink", main = "Histogram of Generated N(0,1)",
 xlab = "Generated Values", border = "white")
}

# Contoh penggunaan
set.seed(1)
# 1. Bangkitkan data
data <- normal_baku(1)
data
## [1] 9.272321 7.760433
# 2. Hitung mean dan varian
stats <- calculate_statistics(data)
cat("Mean:", stats$mean, "\n")
## Mean: 8.516377
cat("Variance:", stats$variance, "\n")
## Variance: 1.142902
# 3. Buat histogram
plot_histogram(data)

## Distribusi Gamma
generate_gamma <- function(alpha) {
  b <- (exp(1) + alpha) / exp(1) # Langkah pertama: hitung b
  
  repeat {
    U1 <- runif(1) # Langkah pertama: bangkitkan U1
    P <- b * U1 # Hitung P
    
    if (P <= 1) {
      # Langkah kedua
      Y <- P^(1 / alpha) # Hitung Y
      U2 <- runif(1) # Bangkitkan U2
      if (U2 <= exp(-Y)) { # Kondisi U2 <= exp(-Y)
        return(Y) # Kembalikan Y
      }
    } else {
      # Langkah ketiga
      Y <- -log((b - P) / alpha) # Hitung Y
      U2 <- runif(1) # Bangkitkan U2
      if (U2 <= Y^(alpha - 1)) { # Kondisi U2 <= Y^(alpha - 1)
        return(Y) # Kembalikan Y
      }
    }
  }
}

## Fungsi untuk menghasilkan n sampel
generate_gamma_samples <- function(alpha, n_samples) {
  samples <- numeric(n_samples)
  for (i in 1:n_samples) {
    samples[i] <- generate_gamma(alpha) # Panggil generate_gamma untuk setiap sampel
  }
  return(samples)
}

## Parameter
set.seed(100) # Untuk reproduktifitas
alpha <- 2
n_samples <- 10000

## Bangkitkan sampel distribusi Gamma
gamma_samples <- generate_gamma_samples(alpha, n_samples)
cat("Bangkitan data distribusi gamma:","\n")
## Bangkitan data distribusi gamma:
gamma_samples[1:100]
##   [1] 0.7308952 0.9791315 1.8151597 0.9740092 1.1225223 0.6975863 1.5795052
##   [8] 0.5959508 0.8539291 1.6126906 0.9762681 1.3300452 4.7042095 1.6449102
##  [15] 1.0663388 1.6574611 0.6004509 0.7574431 0.6396159 1.0365279 0.4629731
##  [22] 1.0519497 3.3750092 0.8790163 0.8458984 1.2257583 2.0841898 1.9376332
##  [29] 2.6639610 0.2561565 1.4633864 2.5163678 0.7884423 2.5107098 0.9477264
##  [36] 0.2287482 0.7538658 0.2669413 3.6861958 0.1415635 1.9530819 0.3748060
##  [43] 3.5227991 2.6234912 0.8297651 0.7820864 5.4577633 0.9785364 1.4821110
##  [50] 1.0090152 0.9052644 1.2602602 3.1450069 0.1844442 0.4901346 1.0747004
##  [57] 1.9956430 0.1817021 1.8296054 0.9128381 0.3936081 0.2153930 1.5730703
##  [64] 0.8711992 1.0227455 1.7174118 3.3101690 2.7108273 0.5681083 0.4630336
##  [71] 5.0713700 1.2216513 0.4549840 2.5901999 1.7528969 0.3545499 0.6161977
##  [78] 2.3722559 0.8908579 1.0592051 0.3643290 0.8017520 0.9780281 2.0104911
##  [85] 0.8323526 3.0766274 1.2329955 1.2232869 0.3257712 0.8225760 1.9941199
##  [92] 0.7445011 1.1017077 1.5465800 0.7484037 2.5630762 1.2538346 0.8739356
##  [99] 1.2676123 0.9165594
mean_random_gamma <- mean(gamma_samples)
var_random_gamma <- var (gamma_samples)
cat ("Mean dari bilangan acak distribusi gamma:", mean_random_gamma, "\n")
## Mean dari bilangan acak distribusi gamma: 1.406124
cat ("varian dari bilangan acak distribusi gamma:", var_random_gamma, "\n")
## varian dari bilangan acak distribusi gamma: 1.069416
## Visualisasi histogram
hist(
  gamma_samples,
  breaks = 40,
  probability = TRUE,
  main = paste("Histogram Sampel Distribusi Gamma (alpha =", alpha, ")"),
  xlab = "Nilai",
  ylab = "Probabilitas",
  col = "pink",
  border = "black"
)

## Tambahkan kurva distribusi Gamma teoritis
curve(
  dgamma(x, shape = alpha, scale = 1), 
  add = TRUE, 
  col = "red", 
  lwd = 2
)

# Fungsi untuk membangkitkan satu bilangan acak Poisson
generate_poisson <- function(lambda) {
  # Langkah 1: Hitung F
  F <- exp(-lambda)
  
  # Inisialisasi
  k <- 1
  Pk <- 1
  
  repeat {
    # Langkah 4: Bangkitkan bilangan random U
    U <- runif(1)
    
    # Langkah 5: Hitung Pk
    if (k == 1) {
      Pk <- U
    } else {
      Pk <- Pk * U
    }
    
    # Langkah 6: Periksa apakah Pk < F
    if (Pk < F) {
      # Jika ya, hitung X = k - 1
      return(k - 1)
    } else {
      # Jika tidak, tingkatkan k dan ulangi
      k <- k + 1
    }
  }
}

# Fungsi untuk membangkitkan n bilangan acak Poisson
generate_poisson_samples <- function(lambda, n_samples) {
  samples <- numeric(n_samples)
  for (i in 1:n_samples) {
    samples[i] <- generate_poisson(lambda)
  }
  return(samples)
}
# Parameter lambda
lambda <- 10
n_samples <- 100000

# Bangkitkan data sampel
set.seed(123) # Untuk hasil yang dapat direproduksi
poisson_samples <- generate_poisson_samples(lambda, n_samples)

# Lihat beberapa hasil sampel
cat("Contoh Data Poisson:\n", poisson_samples[1:100], "\n")
## Contoh Data Poisson:
##  14 14 10 7 7 16 10 12 14 13 14 5 9 11 15 14 10 12 11 14 15 4 10 4 9 8 10 8 14 10 12 10 11 8 12 7 14 8 9 11 11 10 8 9 10 8 13 13 7 13 13 7 9 9 12 12 12 9 4 15 7 9 8 8 12 3 9 7 13 8 8 9 9 12 4 13 5 10 8 9 14 9 5 12 14 9 8 12 7 10 11 10 11 10 10 15 13 8 6 16
# Statistik deskriptif
cat("Rata-rata Sampel:", mean(poisson_samples), "\n")
## Rata-rata Sampel: 9.98604
cat("Variansi Sampel:", var(poisson_samples), "\n")
## Variansi Sampel: 9.979425
# Visualisasi histogram
hist(
  poisson_samples,
  breaks = max(poisson_samples) - min(poisson_samples) + 1,
  main = paste("Histogram Sampel Distribusi Poisson (lambda =", lambda, ")"),
  xlab = "Nilai",
  ylab = "Frekuensi",
  col = "pink",
  border = "black",
  probability = TRUE
)

# Tambahkan garis distribusi teoritis
x_vals <- 0:max(poisson_samples)
lines(
  x_vals,
  dpois(x_vals, lambda = lambda),
  type = "h",
  col = "red",
  lwd = 2
)