← Kembali ke kursus
Pelajaran kursus · Go
Pelajaran 34

Random

Bilangan acak untuk permainan dan sampel data.

Pahami konsepnya

Paket math/rand menghasilkan bilangan acak semu (pseudorandom): cukup acak untuk permainan, simulasi, dan sampel — tetapi BUKAN untuk keamanan. Sejak Go 1.20 sumber acaknya otomatis di-seed, jadi rand.Intn langsung bisa dipakai tanpa rangkaian seed manual yang dulu wajib.

Fungsi inti: rand.Intn(n) memberi angka 0 sampai n-1, rand.Int() seluruh int, rand.Float64() desimal 0–1, dan rand.Shuffle mengacak urutan slice di tempat. Memilih elemen acak dari koleksi biasanya sebatas indeks acak: data[rand.Intn(len(data))].

Untuk kebutuhan kriptografi — token, password, kunci sesi — pakailah crypto/rand: sumbernya dari sistem operasi dan aman dipakai menghadapi penyerang. math/rand yang bisa diprediksi akan berbahaya di sana; membedakan keduanya adalah keputusan desain, bukan detail.

Coba contoh kode

package main

import (
    "fmt"
    "math/rand"
    "time"
)

func main() {
    // Dibutuhkan oleh Go 1.13 pada editor situs.
    rand.Seed(time.Now().UnixNano())
    fmt.Println("dadu:", rand.Intn(6)+1)
    fmt.Println("desimal:", rand.Float64())

    warna := []string{"merah", "hijau", "biru"}
    fmt.Println("pilih:", warna[rand.Intn(len(warna))])
}

rand.Intn(6) menghasilkan 0–5, jadi +1 menggesernya menjadi lemparan dadu 1–6. Elemen acak diambil lewat indeks acak dengan len sebagai batas. Editor situs memakai Go 1.13, sehingga rand.Seed diperlukan agar urutan berbeda setiap eksekusi; mulai Go 1.20, sumber acak global otomatis di-seed.

Mengacak urutan slice

func main() {
    kartu := []int{1, 2, 3, 4, 5}
    rand.Shuffle(len(kartu), func(i, j int) {
        kartu[i], kartu[j] = kartu[j], kartu[i]
    })
    fmt.Println(kartu)
}

rand.Shuffle menerima panjang slice dan fungsi penukar; ia memanggil fungsi itu berkali-kali dengan pasangan indeks acak. Hasilnya pengacakan di tempat tanpa slice baru — standar untuk mengocok kartu, urutan soal kuis, atau sampel acak.

Latihan singkat

Uji: lempar dua dadu sepuluh kali — program harus mencetak sepuluh baris `lempar N: total X` lalu satu baris akhir `total 7 muncul K kali`.