Simulasi antrean, perhitungan Monte Carlo, bootstrap, dan pembagian data latih-uji — semuanya dimulai dari angka acak. Komputer tidak menghasilkan keacakan sungguhan: angka “acak"nya dirakit oleh pseudo-random number generator (PRNG), deret deterministik yang perilakunya menyerupai keacakan. Karena seluruh analisis berikutnya bergantung pada deret ini, kita perlu memahami empat pintu masuknya, cara mengendalikannya, dan cara memeriksanya. Cakupan chapter ini:
rand,randn,randi, danrandperm— empat fungsi bangkit- Mekanisme PRNG, seed, dan
rnguntuk reproducibility - Transformasi distribusi: uniform ke rentang target, Box-Muller ke normal
- Sampling dengan dan tanpa penggantian
Empat Fungsi Bangkit Angka Acak #
Aturannya: pilih fungsi sesuai bentuk angka yang dibutuhkan. Mekanismenya: keempatnya digerakkan generator yang sama — rand adalah bentuk dasarnya, sementara randn, randi, dan randperm memetakan deret dasar itu ke sebaran berbeda.
| Fungsi | Sebaran hasil | Rentang | Bentuk panggilan |
|---|---|---|---|
rand(r,c) | uniform kontinu | [0, 1) | rand(2,4) |
randn(r,c) | normal standar | seluruh garis riil | randn(2,4) |
randi([a b],r,c) | bulat seragam | a..b | randi([10 99],2,4) |
randperm(n,k) | permutasi indeks | bilangan bulat 1..n | randperm(8,4) |
u = rand(2, 4);
z = randn(2, 4);
idx = randi([10, 99], 2, 4);
perm = randperm(8, 4);
fprintf('rand(2,4) : ukuran %dx%d, nilai di [0,1)\n', size(u));
fprintf('randn(2,4) : ukuran %dx%d, nilai riil apa pun\n', size(z));
fprintf('randi([10,99]) : ukuran %dx%d, bilangan bulat 10..99\n', size(idx));
fprintf('randperm(8,4) : %d indeks unik dari 1..8\n', numel(unique(perm)));Output yang Dihasilkan:
rand(2,4) : ukuran 2x4, nilai di [0,1)
randn(2,4) : ukuran 2x4, nilai riil apa pun
randi([10,99]) : ukuran 2x4, bilangan bulat 10..99
randperm(8,4) : 4 indeks unik dari 1..8Mari kita bedah baris-baris kode di atas:
- Baris 1-4: keempat fungsi dipanggil sekali; isi
u,z,idx, danpermberbeda pada setiap eksekusi — itulah gunanya. - Baris 5-8 (empat
fprintf): blok output hanya mencetak sifat yang dijamin kontrak fungsi — ukuran, rentang, dan keunikan — bukan angkanya. numel(unique(perm)):randperm(n,k)menjamin k indeks berbeda; verifikasi ini penting saat kita membangun sampling.
Pseudorandom: Mekanisme di Balik Layar #
PRNG menyimpan sebuah state internal; setiap panggilan rand menghitung angka berikutnya dari state itu lalu memperbarui state-nya. Seed adalah nilai yang menyetel state awal — deret yang sama selalu lahir dari seed yang sama. Inilah dasar reproducibility: kita mengunci deret agar hasil analisis bisa dijalankan ulang.
rng(42); % setel generator ke seed 42
r1 = rand(1, 3);
rng(42); % kembalikan ke seed yang sama
r2 = rand(1, 3);
fprintf('deret identik setelah rng(42) dua kali: %d\n', isequal(r1, r2));Output yang Dihasilkan:
deret identik setelah rng(42) dua kali: 1Mari kita bedah baris-baris kode di atas:
- Baris 1 dan 3 (
rng(42)): setiap panggilan mereset state generator; perintah ini tersedia di MATLAB dan di Octave 8 ke atas. - Baris 2 dan 4 (
rand(1,3)): kedua deret lahir dari state identik, sehinggaisequalmengembalikan 1 (benar). - Implikasinya: meletakkan
rng(42)di baris pertama skrip membuat seluruh hasil acak di dalamnya dapat direproduksi — di engine yang sama.
Memeriksa Kualitas Generator dengan Statistik Agregat #
Deret acak yang baik harus mematuhi teori peluang. Karena rand menarget sebaran uniform [0,1), rata-ratanya mendekati 0.5 dan simpangan bakunya mendekati 1/√12 ≈ 0.2887; randn mendekati 0 dan 1. Kita periksa dengan 100.000 sampel:
rng(42); % reproducible di engine yang sama
u = rand(100000, 1);
z = randn(100000, 1);
fprintf('rand : mean = %.4f, std = %.4f\n', mean(u), std(u));
fprintf('teori : mean = 0.5000, std = %.4f\n', 1/sqrt(12));
fprintf('randn : mean = %.4f, std = %.4f\n', mean(z), std(z));
fprintf('teori : mean = 0.0000, std = 1.0000\n');
fprintf('fraksi |z| < 1 = %.4f (teori 0.6827)\n', mean(abs(z) < 1));Output yang Dihasilkan:
rand : mean = 0.5001, std = 0.2890
teori : mean = 0.5000, std = 0.2887
randn : mean = 0.0012, std = 1.0003
teori : mean = 0.0000, std = 1.0000
fraksi |z| < 1 = 0.6842 (teori 0.6827)Angka pada blok di atas dihasilkan GNU Octave dengan seed rng(42); MATLAB menghasilkan angka yang sedikit berbeda pada digit ke-3 dan ke-4. Yang stabil adalah kedekatannya ke teori — dan justru di situ pelajarannya: mean randn tidak pernah tepat nol karena sampel 100.000 tetap membawa galat sampling sekitar 1/√100000 ≈ 0.003. Perhatikan pula baris terakhir: 68.4% data normal jatuh dalam satu simpangan baku — aturan 68-95-99.7 dari Chapter Distribusi Probabilitas terlihat langsung di sini.
Memilih Distribusi: Transformasi dan Box-Muller #
Generator dasar hanya menghasilkan uniform [0,1) — sebaran lain kita bangun lewat transformasi. Untuk rentang [a,b), rumusnya linear: x = a + (b−a)·u. Untuk sebaran normal, transformasi klasiknya Box-Muller: sepasang uniform dipetakan menjadi satu nilai normal lewat koordinat polar. Kita uji keduanya dengan pasangan uniform tetap agar hasilnya bisa ditampilkan:
u1 = [0.10 0.40 0.70 0.25 0.90];
u2 = [0.60 0.15 0.50 0.80 0.35];
% uniform [0,1) -> uniform [30, 50): gaji simulasi (juta rupiah)
gajiSim = 30 + 20*u1;
for k = 1:numel(u1)
fprintf('u = %.2f -> gaji simulasi = %.4f\n', u1(k), gajiSim(k));
end
% Box-Muller: sepasang uniform -> normal standar
z = sqrt(-2*log(u1)) .* cos(2*pi*u2);
for k = 1:numel(z)
fprintf('u1 = %.2f, u2 = %.2f -> z = %.4f\n', u1(k), u2(k), z(k));
endOutput yang Dihasilkan:
u = 0.10 -> gaji simulasi = 32.0000
u = 0.40 -> gaji simulasi = 38.0000
u = 0.70 -> gaji simulasi = 44.0000
u = 0.25 -> gaji simulasi = 35.0000
u = 0.90 -> gaji simulasi = 48.0000
u1 = 0.10, u2 = 0.60 -> z = -1.7361
u1 = 0.40, u2 = 0.15 -> z = 0.7957
u1 = 0.70, u2 = 0.50 -> z = -0.8446
u1 = 0.25, u2 = 0.80 -> z = 0.5145
u1 = 0.90, u2 = 0.35 -> z = -0.2698Mari kita bedah baris-baris kode di atas:
- Baris 4 (
30 + 20*u1): u = 0.10 dipetakan ke 30 + 20·0.10 = 32 — geser 30, regangkan 20; ujung u = 1 akan jatuh tepat di 50. - Baris 10 (
sqrt(-2*log(u1))): jarak radius dari titik acak berdistribusi eksponensial;u1wajib > 0 karena log 0 tak terdefinisi. - Baris 10 (
cos(2*pi*u2)): sudut acak penuh lingkaran; kombinasi radius-sudut menghasilkan titik 2D berdistribusi normal, dan koordinatnya (cos atau sin) masing-masing normal 1D. - Baris 13-15 (loop): hasil z menyebar di sekitar nol dengan nilai ekstrem seperti −1.74 — persis perilaku
randn.
Sampling dengan dan tanpa Penggantian #
Dua cara mengambil dari himpunan data: dengan penggantian — item dikembalikan setelah diambil, sehingga bisa terambil lagi; tanpa penggantian — item sekali ambil, setiap hasil unik. Mekanismenya di MATLAB: randi memilih indeks bebas (boleh berulang), randperm menghasilkan indeks berbeda. Indeks tetap di bawah menunjukkan penggantian secara eksplisit:
data = [10 20 30 40];
tarikDengan = data([3 1 3 2]); % indeks 3 muncul dua kali
for k = 1:numel(tarikDengan)
fprintf('tarikan %d: nilai %g\n', k, tarikDengan(k));
end
fprintf('nilai unik: %d dari %d tarikan\n', ...
numel(unique(tarikDengan)), numel(tarikDengan));
tanpa = data(randperm(4));
fprintf('tanpa penggantian: %d dari %d tarikan (selalu unik)\n', ...
numel(unique(tanpa)), numel(tanpa));Output yang Dihasilkan:
tarikan 1: nilai 30
tarikan 2: nilai 10
tarikan 3: nilai 30
tarikan 4: nilai 20
nilai unik: 3 dari 4 tarikan
tanpa penggantian: 4 dari 4 tarikan (selalu unik)Mari kita bedah baris-baris kode di atas:
- Baris 2 (
data([3 1 3 2])): indeks vektor[3 1 3 2]menarik elemen ke-3, ke-1, ke-3 lagi, ke-2 — nilai 30 lahir dua kali karena penggantian. - Baris 8 (
numel(unique(...))): 3 nilai unik dari 4 tarikan — duplikasi terukur. - Baris 10 (
data(randperm(4))):randperm(4)adalah permutasi penuh 1..4, jadi keempat elemen pasti terambil tepat sekali — kontrak yang dipegangrandperm.
Reproducibility dalam Riset #
Angka acak membuat hasil berubah antar eksekusi — dan itu masalah saat kolega mencoba meniru analisis kita. Solusinya sudah ada di tangan: rng di baris pertama skrip.
Berkas contoh.m pada bagian bawah halaman merangkai seluruh pola chapter: ukuran dan kontrak keempat fungsi, reproducibility rng, statistik agregat 100.000 sampel, Box-Muller, dan kedua mode sampling.
Ringkasan #
Empat pintu rand/randn/randi/randperm menutupi hampir semua kebutuhan angka acak, dan semuanya berakar pada satu PRNG yang dikendalikan rng. Statistik agregat memverifikasi kualitas deret, transformasi memetakan uniform ke sebaran target — linear untuk rentang, Box-Muller untuk normal — dan pilihan randi vs randperm menentukan sampling dengan atau tanpa penggantian. Dengan alat ini, kita siap mengambil sampel dari populasi: materi Chapter Sampling.