Salah satu modul yang layak disebutkan adalah modul bernama random.
Modul ini menyediakan beberapa mekanisme yang memungkinkan Anda untuk beroperasi dengan angka sembarang.Â
Perhatikan awalan pseudo - angka yang dihasilkan oleh modul mungkin terlihat acak dalam arti bahwa Anda tidak dapat memprediksi nilai selanjutnya, tetapi jangan lupa bahwa semua angka tersebut dihitung menggunakan algoritma yang sangat halus.
Algoritma-algoritma tersebut tidak acak - mereka bersifat deterministik dan dapat diprediksi. Hanya proses fisik yang berjalan sepenuhnya di luar kendali kita (seperti intensitas radiasi kosmis) yang dapat digunakan sebagai sumber data acak sebenarnya. Data yang dihasilkan oleh komputer deterministik tidak dapat dianggap acak dengan cara apa pun.
Generator angka acak mengambil nilai yang disebut seed, memperlakukannya sebagai nilai masukan, menghitung nomor "acak" berdasarkan itu (metode tergantung pada algoritma yang dipilih) dan menghasilkan nilai seed baru.
Panjang siklus di mana semua nilai seed unik mungkin sangat panjang, tetapi tidak tak terbatas - suatu saat nilai seed akan mulai berulang, dan nilai yang dihasilkan juga akan berulang. Ini normal. Ini adalah fitur, bukan kesalahan atau bug.
Nilai seed awal, yang diatur selama awal program, menentukan urutan di mana nilai yang dihasilkan akan muncul.
Faktor acak dari proses ini dapat ditingkatkan dengan menetapkan seed dengan nomor yang diambil dari waktu saat ini - ini dapat memastikan bahwa setiap peluncuran program akan dimulai dari nilai seed yang berbeda (dengan kata lain, akan menggunakan nomor acak yang berbeda).
Untungnya, inisialisasi seperti itu dilakukan oleh Python selama impor modul.
Fungsi umum yang bernama random() (jangan keliru dengan nama modul) menghasilkan bilangan pecahan x yang berasal dari rentang (0.0, 1.0) - dengan kata lain: (0.0 <= x < 1.0).
Program contoh di bawah ini akan menghasilkan lima nilai semuacak - karena nilai benih saat ini (yang cukup sulit diprediksi) menentukan nilai-nilai tersebut, Anda tidak dapat menebaknya:
Jalankan program tersebut. Ini yang kita dapatkan:
Fungsi seed() dapat langsung mengatur seed generator. Kami akan menunjukkan dua variasinya:
seed() - mengatur seed dengan waktu saat ini;
seed(int_value) - mengatur seed dengan nilai integer int_value.
Kami telah memodifikasi program sebelumnya - pada dasarnya, kami telah menghapus setiap jejak keacakan dari kode:
Karena seed selalu diatur dengan nilai yang sama, urutan nilai yang dihasilkan selalu terlihat sama.
Jalankan program tersebut. Ini yang kita dapatkan:
Dan kamu?
Catatan: nilai-nilai kamu mungkin sedikit berbeda dari kami jika sistem kamu menggunakan aritmatika titik mengambang yang lebih presisi atau kurang presisi, tetapi perbedaan akan terlihat jauh dari titik desimal.
Jika Anda ingin mendapatkan nilai acak bilangan bulat, salah satu dari fungsi berikut akan cocok:
randrange(akhir)
randrange(mulai, akhir)
randrange(mulai, akhir, langkah)
randint(kiri, kanan)
Tiga pemanggilan pertama akan menghasilkan bilangan bulat yang diambil (secara semu) dari rentang (masing-masing):
range(akhir)
range(mulai, akhir)
range(mulai, akhir, langkah)
Perhatikan pengecualian sisi kanan yang tersirat!
Fungsi terakhir adalah ekuivalen dengan randrange(kiri, kanan+1) - ia menghasilkan nilai bilangan bulat i, yang jatuh dalam rentang [kiri, kanan] (tidak ada pengecualian pada sisi kanan).
Lihatlah kode di editor. Program contoh ini akan menghasilkan baris yang terdiri dari tiga nol dan nol atau satu pada posisi keempat secara berturut-turut.
Fungsi-fungsi sebelumnya memiliki satu kekurangan penting - mereka dapat menghasilkan nilai yang berulang meskipun jumlah panggilan berikutnya tidak lebih besar dari lebar rentang yang ditentukan.
Perhatikan kode di bawah ini - program sangat mungkin menghasilkan himpunan angka di mana beberapa elemen tidak unik:
Ini adalah apa yang kami dapatkan dalam salah satu peluncuran:
As you can see, this is not a good tool for generating numbers in a lottery. Fortunately, there is a better solution than writing your own code to check the uniqueness of the "drawn" numbers.
It's a function named in a very suggestive way - choice:
choice(sequence)
sample(sequence, elements_to_choose)
The first variant chooses a "random" element from the input sequence and returns it.
The second one builds a list (a sample) consisting of the elements_to_choose element "drawn" from the input sequence.
In other words, the function chooses some of the input elements, returning a list with the choice. The elements in the sample are placed in random order. Note: the elements_to_choose must not be greater than the length of the input sequence.
Look at the code below:
Sekali lagi, keluaran program tidak dapat diprediksi. Hasil kami terlihat seperti ini: