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`.