Belajar dengan membaca secara berurutan

random dan secrets — Memilih Jenis Angka Acak yang Tepat

Pelajari modul random dan secrets Python dari dasar. Mencakup sekuens pseudo-random yang bisa direproduksi dengan random.choice / randint / shuffle / sample plus seed, token aman secara kriptografi dengan secrets.token_hex / token_urlsafe, dan kapan pakai yang mana — dengan latihan praktik yang bisa dijalankan.

Artikel ini membahas dua modul angka acak di standard library. random menyediakan nilai pseudo-random untuk testing, game, dan simulasi (bisa direproduksi dengan seed), dan secrets menyediakan nilai tak terduga untuk password, token reset, dan API key (diambil dari sumber acak kriptografis OS). Memilih yang tepat untuk pekerjaan adalah inti sisa artikel ini.

Bagaimana random dan secrets Berbeda

Kedua modul mengembalikan angka acak, tetapi mekanisme dan kasus penggunaannya benar-benar berbeda. random dibangun di atas Mersenne Twister (generator pseudo-random yang banyak digunakan), dan memanggil random.seed(nilai) memungkinkanmu mereproduksi sekuens yang sama. secrets, di sisi lain, mengambil dari sumber acak kriptografis OS (seperti /dev/urandom), jadi tidak ada konsep `seed` dan nilainya tak terduga setiap kali.

Untuk kasus seperti testing atau game — "tidak masalah kalau hasilnya bocor" — gunakan random. Untuk password, token, dan ID sesi — "kalau ada yang bisa memprediksi nilainya, kamu punya insiden keamanan" — gunakan secrets.

Kapan Pakai random vs secrets
randomPseudo-random bisa direproduksisekuens sama dengan seedGame / testingsimulasisecretsKripto tak terdugatanpa seedToken / passwordID sesi
random memberi nilai pseudo-random yang bisa direproduksi — untuk testing dan game. secrets mengambil dari sumber kriptografis OS untuk nilai tak terduga — untuk token dan pembuatan password. Pilih yang tepat untuk pekerjaan.
Aspekrandomsecrets
SumberMersenne Twister (algoritma)Sumber kripto OS (/dev/urandom, dll.)
ReproduksibilitasSekuens sama bisa direproduksi dengan seedTidak bisa direproduksi (selalu beda)
KecepatanCepatLebih lambat (bukan masalah untuk penggunaan tipikal)
Paling cocok untukTesting, game, simulasiToken, password, ID sesi

random — Dasar (randint / uniform / choice)

Dasar random adalah tiga hal: integer acak / float acak / memilih satu elemen dari list. random.randint(min, max) mengembalikan integer termasuk kedua ujung, random.uniform(min, max) mengembalikan float dalam rentang yang diberikan, dan random.choice(list) mengembalikan satu elemen dari list.

Mari mulai tanpa seed dan lihat bagaimana fungsi-fungsi dasar ini berperilaku.

Fungsi Dasar random
random.randint(a, b)→ integer di [a, b]random.uniform(a, b)→ float di [a, b]random.choice(list)→ satu elemen
randint integer acak dalam rentang (kedua ujung termasuk), uniform float acak dalam rentang, dan choice mengambil satu elemen dari list. Bentuk input dan output berbeda untuk masing-masing, jadi pilih sesuai kebutuhan.
FungsiMengembalikanPenggunaan tipikal
random.randint(a, b)Integer di [a, b] (kedua ujung termasuk)Lemparan dadu, ID test
random.uniform(a, b)Float di [a, b]Noise, simulasi probabilistik
random.choice(seq)Satu elemen dari sequencePilih satu item dari menu

Coba tiga fungsi random dasar. Nilainya beda setiap run, jadi kita verifikasi via pengecekan rentang dan keanggotaan alih-alih perbandingan persis.

① Import random.

② Buat integer di 1〜100 dengan random.randint dan simpan sebagai n; buat float di 0〜1 dengan random.uniform dan simpan sebagai f; pilih satu elemen dari ["Apple", "Banana", "Cherry"] dengan random.choice dan simpan sebagai picked.

③ Cetak apakah n ada di 1〜100, apakah f ada di 0〜1, dan apakah picked adalah anggota list asli, diformat sebagai int range: True / False, float range: True / False, in list: True / False.

(Kalau kode berjalan benar, penjelasan akan muncul.)

Python Editor

Jalankan kode untuk melihat output

random — Reproduksibilitas via Seed dan Operasi Koleksi

Sekarang mari lihat reproduksibilitas test dengan `random.seed` dan fungsi operasi koleksi (shuffle / sample). Setelah memanggil random.seed(N), seed yang sama selalu menghasilkan sekuens yang sama. random.shuffle(list) mengacak elemen list di tempat, dan random.sample(list, k) mengembalikan list baru berisi k elemen unik yang diambil darinya.

seed / shuffle / sample
random.seed(nilai)→ kunci state internalbisa direproduksirandom.shuffle(list)→ acak di tempatmengembalikan Nonerandom.sample(list, k)→ k item uniklist baru
seed(nilai) mengunci state internal, jadi sekuens sama berulang. shuffle mengatur ulang list asli di tempat (mengembalikan None). sample mengembalikan list baru berisi k elemen unik (asli tidak diubah).
FungsiMengembalikanPenggunaan tipikal
random.seed(value)None (menginisialisasi state internal)Test yang bisa direproduksi
random.shuffle(seq)None (mengacak list asli)Mengacak urutan list
random.sample(seq, k)List baru berisi k elemen unikMemilih k responden dari survei

Konfirmasi bahwa nilai yang dihasilkan dengan seed 42 cocok dengan nilai yang dihasilkan lagi setelah re-seed ke 42.

① Import random.

② Set seed ke 42, lalu panggil random.randint(1, 100) sekali dan simpan sebagai n1.

③ Set seed kembali ke 42, lalu panggil random.randint(1, 100) lagi dan simpan sebagai n2.

④ Cetak n1 == n2 sebagai reproducible: True.

Python Editor

Jalankan kode untuk melihat output

Lihat perbedaan antara shuffle (mengatur ulang list itu sendiri) dan sample (mengembalikan list baru).

① Set seed ke 7 dan siapkan cards = [1, 2, 3, 4, 5].

② Panggil random.shuffle(cards) untuk mengatur ulang isi cards di tempat. Cetak cards yang sudah diatur ulang sebagai after shuffle: ◯◯.

③ Re-seed ke 7, lalu panggil random.sample([1, 2, 3, 4, 5], 3) untuk memilih 3 elemen unik, dan cetak hasilnya sebagai picked 3: ◯◯.

Python Editor

Jalankan kode untuk melihat output

secrets — Acak Kuat untuk Keamanan

Modul random dari bagian sebelumnya adalah generator pseudo-random untuk testing — kalau state internalnya bocor, nilai berikutnya bisa diprediksi. Untuk hal seperti token reset password, API key, dan ID sesi"kalau penyerang bisa memprediksi nilainya, kamu punya kerentanan" — pilih modul `secrets`, yang menggunakan sumber acak kriptografis OS.

secrets punya API yang jauh lebih kecil dari random — kebanyakan adalah helper yang mengubah byte acak menjadi string hex atau string aman URL.

FungsiMengembalikanPenggunaan tipikal
secrets.token_bytes(n)n byte acakKunci kripto, token biner internal
secrets.token_hex(n)String hex panjang 2*nID sesi login
secrets.token_urlsafe(n)String aman URL (gaya Base64)Disisipkan di URL link reset
secrets.choice(seq)Satu elemen dari seq, secara kriptografisSaat urutan tampilan tidak boleh ditebak
secrets.compare_digest(a, b)True / False (tahan timing attack)Perbandingan hash / token (gunakan ganti ==)

Buat token keamanan dengan secrets dan periksa panjang serta set karakternya. Nilai sebenarnya berubah setiap run, jadi kita verifikasi properti seperti panjang.

① Import secrets.

② Buat token hex 16 byte, cetak panjangnya sebagai hex length: ◯, lalu cek apakah hanya berisi karakter di 0-9 dan a-f sebagai hex is hex only: True / False.

③ Buat token aman URL 16 byte dan cetak panjangnya sebagai urlsafe length: ◯.

Python Editor

Jalankan kode untuk melihat output
QUIZ

Cek Pemahaman

Jawab setiap pertanyaan satu per satu.

Soal 1Modul mana yang harus kamu jangkau untuk membuat token reset password?

Soal 2Setelah memanggil random.seed(42) lalu random.randint(1, 100), apa yang terjadi kalau kamu lakukan hal yang sama lagi?

Soal 3Pilihan terbaik saat kamu ingin list yang diacak bisa direproduksi untuk testing?