Definisi dan Mekanisme PRNG
Pseudorandom Number Generator (PRNG) adalah algoritma yang menghasilkan urutan angka yang tampak acak namun sebenarnya ditentukan oleh nilai awal yang disebut seed. Dalam Python, PRNG tidak menghasilkan keacakan sejati (true randomness) karena bersifat deterministik; jika Anda menggunakan seed yang sama, urutan angka yang dihasilkan akan selalu identik.
Python menyediakan dua pendekatan utama untuk menghasilkan angka acak: modul random untuk kebutuhan simulasi atau statistik yang tidak memerlukan keamanan tinggi, dan modul secrets untuk kebutuhan kriptografi atau token keamanan yang memerlukan entropi tinggi.
Implementasi Kode Python
Berikut adalah cara penggunaan modul standar untuk menghasilkan angka acak dalam berbagai format:
import random
import secrets
# 1. Menggunakan modul random (PRNG standar)
random.seed(42) # Mengatur seed untuk hasil yang dapat direproduksi
print(f"Angka float acak: {random.random()}")
print(f"Integer acak (1-10): {random.randint(1, 10)}")
# 2. Menggunakan modul secrets (CSPRNG untuk keamanan)
# Menghasilkan token hex aman untuk password atau session
token = secrets.token_hex(16)
print(f"Token aman: {token}")Tabel Perbandingan Modul Random vs Secrets
| Fitur | Modul 'random' | Modul 'secrets' |
|---|---|---|
| Tujuan Utama | Simulasi, Statistik | Kriptografi, Keamanan |
| Algoritma | Mersenne Twister | OS-specific (CSPRNG) |
| Keamanan | Tidak Aman (Prediktabilitas tinggi) | Sangat Aman (Cryptographically Secure) |
| Reproduksibilitas | Ya (via seed) | Tidak (Non-deterministik) |
Analisis Teknis dan Praktik Terbaik
Modul random menggunakan algoritma Mersenne Twister. Meskipun sangat cepat dan memiliki periode distribusi yang panjang, algoritma ini memiliki kelemahan fatal: jika seseorang mengetahui cukup banyak output sebelumnya, mereka dapat memprediksi angka berikutnya. Oleh karena itu, dilarang keras menggunakan modul random untuk pembuatan kunci enkripsi, token reset password, atau sistem taruhan uang asli.
Untuk aplikasi yang membutuhkan keamanan, gunakan secrets yang memanfaatkan os.urandom(). Modul ini mengambil entropi dari sistem operasi (seperti gangguan perangkat keras atau aktivitas kernel), sehingga outputnya tidak dapat diprediksi secara matematis oleh pihak luar.
Tips Troubleshooting
- Jika hasil simulasi Anda tidak konsisten saat pengujian, pastikan Anda tidak memanggil
random.seed()di dalam loop. Cukup panggil sekali di awal program. - Untuk menghasilkan angka acak dalam rentang tertentu dengan distribusi normal, gunakan
random.gauss(mu, sigma). - Selalu gunakan
secrets.choice()jika Anda perlu memilih elemen dari daftar untuk keperluan otentikasi atau pemilihan acak yang sensitif.