Seberapa acak itu acak? . Setiap kali Anda membuat data, string, atau angka acak dengan Python, ada baiknya setidaknya memiliki gambaran kasar tentang bagaimana data itu dihasilkan
Di sini, Anda akan membahas beberapa opsi berbeda untuk menghasilkan data acak dengan Python, dan kemudian membuat perbandingan masing-masing dalam hal tingkat keamanan, keserbagunaan, tujuan, dan kecepatannya.
Saya berjanji bahwa tutorial ini tidak akan menjadi pelajaran dalam matematika atau kriptografi, yang saya tidak akan siap untuk mengajar di tempat pertama. Anda akan mempelajari matematika sebanyak yang diperlukan, dan tidak lebih
Seberapa Acak Itu Acak?
Pertama, penafian yang menonjol diperlukan. Sebagian besar data acak yang dihasilkan dengan Python tidak sepenuhnya acak dalam pengertian ilmiah dari kata tersebut. Sebaliknya, itu adalah pseudorandom. dihasilkan dengan pseudorandom number generator (PRNG), yang pada dasarnya adalah algoritma apa pun untuk menghasilkan data yang tampaknya acak tetapi masih dapat direproduksi
Angka acak “benar” dapat dihasilkan oleh, Anda dapat menebaknya, generator angka acak sejati (TRNG). Salah satu contohnya adalah berulang kali mengambil dadu dari lantai, melemparkannya ke udara, dan membiarkannya mendarat dengan cara yang mungkin.
Dengan asumsi bahwa lemparan Anda tidak memihak, Anda benar-benar tidak tahu di angka berapa dadu akan mendarat. Memutar dadu adalah bentuk kasar penggunaan perangkat keras untuk menghasilkan angka yang tidak deterministik sama sekali. (Atau, Anda dapat meminta dadu-o-matic melakukan ini untuk Anda. ) TRNG berada di luar cakupan artikel ini tetapi tetap layak disebutkan demi perbandingan
PRNG, biasanya dilakukan dengan perangkat lunak daripada perangkat keras, bekerja sedikit berbeda. Berikut deskripsi singkatnya
Mereka mulai dengan nomor acak, yang dikenal sebagai benih, dan kemudian menggunakan algoritme untuk menghasilkan urutan bit acak semu berdasarkan itu. (Sumber)
Anda kemungkinan besar telah diberitahu untuk “membaca dokumen. " dalam beberapa kasus. Yah, orang-orang itu tidak salah. Inilah cuplikan penting dari dokumentasi modul
2 Python. Inilah yang membuat panggilan selanjutnya untuk menghasilkan angka acak yang deterministik. input A selalu menghasilkan output B. Berkat ini juga bisa menjadi kutukan jika digunakan dengan jahat
Mungkin istilah "acak" dan "deterministik" sepertinya tidak bisa berdampingan satu sama lain. Untuk membuatnya lebih jelas, inilah versi
8 awalnya didefinisikan sebagai nilai benih dan kemudian berubah menjadi urutan angka deterministik berdasarkan benih itu
classNotSoRandom(object):defseed(self,a=3):"""Seed the world's most mysterious random number generator."""self.seedval=adefrandom(self):"""Look, random numbers!"""self.seedval=(self.seedval*3)%19returnself.seedval_inst=NotSoRandom()seed=_inst.seedrandom=_inst.random
Jangan menganggap contoh ini terlalu harfiah, karena ini dimaksudkan terutama untuk mengilustrasikan konsepnya. Jika Anda menggunakan nilai seed 1234, urutan panggilan berikutnya ke
Anda akan segera melihat ilustrasi yang lebih serius tentang ini
Hilangkan iklan
Apa Itu “Aman Secara Kriptografis?”
Jika Anda belum muak dengan akronim "RNG", mari kita masukkan satu lagi ke dalam campuran. CSPRNG, atau PRNG yang aman secara kriptografis. CSPRNG cocok untuk menghasilkan data sensitif seperti kata sandi, autentikator, dan token. Diberi string acak, secara realistis tidak ada cara bagi Malicious Joe untuk menentukan string apa yang muncul sebelum atau sesudah string itu dalam urutan string acak
Satu istilah lain yang mungkin Anda lihat adalah entropi. Singkatnya, ini mengacu pada jumlah keacakan yang diperkenalkan atau diinginkan. Misalnya, satu Python yang akan Anda bahas di sini mendefinisikan
0, jumlah byte yang dikembalikan secara default. Pengembang menganggap ini sebagai byte yang "cukup" untuk menjadi jumlah kebisingan yang cukup
Catatan. Melalui tutorial ini, saya berasumsi bahwa satu byte mengacu pada 8 bit, seperti yang terjadi sejak tahun 1960-an, daripada unit penyimpanan data lainnya. Anda bebas menyebutnya oktet jika Anda mau
Poin kunci tentang CSPRNG adalah bahwa mereka masih pseudorandom. Mereka direkayasa dengan cara yang deterministik secara internal, tetapi mereka menambahkan beberapa variabel lain atau memiliki beberapa properti yang membuat mereka "cukup acak" untuk melarang dukungan ke fungsi apa pun yang memaksakan determinisme
Apa yang Akan Anda Bahas Di Sini
Secara praktis, ini berarti Anda harus menggunakan PRNG biasa untuk pemodelan statistik, simulasi, dan membuat data acak dapat direproduksi. Mereka juga jauh lebih cepat daripada CSPRNG, seperti yang akan Anda lihat nanti. Gunakan CSPRNG untuk aplikasi keamanan dan kriptografi di mana sensitivitas data sangat penting
Selain memperluas kasus penggunaan di atas, dalam tutorial ini, Anda akan mempelajari alat Python untuk menggunakan PRNG dan CSPRNG
_9 mengembalikan float acak dalam interval [0. 0, 1. 0). Hasilnya akan selalu kurang dari endpoint kanan (1. 0). Ini juga dikenal sebagai rentang semi-terbuka
Jika Anda menjalankan kode ini sendiri, saya berani bertaruh tabungan hidup saya bahwa angka yang dikembalikan pada mesin Anda akan berbeda. Saat Anda tidak menyemai generator adalah menggunakan waktu sistem Anda saat ini atau "sumber acak" dari OS Anda jika tersedia
_4, Anda dapat mengecualikan sisi kanan interval, artinya angka yang dihasilkan selalu terletak di dalam [x, y) dan akan selalu lebih kecil dari titik akhir kanan
>>>
>>> random.randrange(1,10)5
_
Jika Anda perlu membuat float acak yang berada dalam interval [x, y] tertentu, Anda dapat menggunakan
Jika Anda memilih untuk tidak memutasikan daftar asli, Anda harus membuat salinannya terlebih dahulu, lalu mengocok salinannya. Anda dapat membuat salinan daftar Python dengan modul
Sebelum melanjutkan untuk menghasilkan data acak dengan NumPy, mari kita lihat satu lagi aplikasi yang sedikit terlibat. menghasilkan urutan string acak unik dengan panjang seragam
Ini dapat membantu untuk memikirkan tentang desain fungsi terlebih dahulu. Anda harus memilih dari "kumpulan" karakter seperti huruf, angka, dan/atau tanda baca, menggabungkannya menjadi satu string, lalu memeriksa apakah string ini belum dibuat. Python
Untuk versi yang disempurnakan dari fungsi ini, jawaban Stack Overflow ini menggunakan fungsi generator, pengikatan nama, dan beberapa trik lanjutan lainnya untuk membuat versi
Bagaimana dengan menghasilkan data yang berkorelasi? . Salah satu cara untuk melakukannya adalah dengan fungsi NumPy, yang memperhitungkan matriks kovarians. Dengan kata lain, untuk menggambar dari satu variabel acak yang terdistribusi normal, Anda perlu menentukan rata-rata dan variansnya (atau standar deviasi)
Untuk sampel dari distribusi normal multivariat, Anda menentukan rata-rata dan matriks kovarians, dan Anda berakhir dengan beberapa rangkaian data berkorelasi yang masing-masing kira-kira terdistribusi secara normal
Namun, daripada kovarians, korelasi adalah ukuran yang lebih familiar dan intuitif bagi sebagian besar orang. Ini adalah kovarians yang dinormalisasi oleh produk standar deviasi, sehingga Anda juga dapat menentukan kovarians dalam hal korelasi dan standar deviasi
Jadi, bisakah Anda mengambil sampel acak dari distribusi normal multivariat dengan menentukan matriks korelasi dan standar deviasi? . Di sini, S adalah vektor standar deviasi, P adalah matriks korelasinya, dan C adalah matriks kovarians (kuadrat) yang dihasilkan
35, yang pada gilirannya “memungkinkan akses ke kebisingan lingkungan yang dikumpulkan dari driver perangkat dan sumber lain. ” (Terima kasih, Wikipedia. ) Ini adalah informasi kacau yang khusus untuk perangkat keras dan status sistem Anda pada saat tertentu tetapi pada saat yang sama cukup acak
_36 digunakan. Fungsi ini secara teknis masih pseudorandom, tetapi bekerja dengan menghasilkan nilai benih dari variabel seperti ID proses, status memori, dan sebagainya.
_30, tidak ada konsep penyemaian secara manual. Meskipun secara teknis masih pseudorandom, fungsi ini lebih selaras dengan cara kita berpikir tentang keacakan. Satu-satunya argumen adalah jumlah yang akan dikembalikan
Sebelum kita melangkah lebih jauh, ini mungkin saat yang tepat untuk mempelajari pelajaran mini tentang pengkodean karakter. Banyak orang, termasuk saya, memiliki beberapa jenis reaksi alergi ketika mereka melihat
Pertama, ingat salah satu konsep dasar komputasi, yaitu satu byte terdiri dari 8 bit. Anda dapat menganggap bit sebagai satu digit yang bernilai 0 atau 1. Sebuah byte secara efektif memilih antara 0 dan 1 delapan kali, sehingga
_45, dengan beberapa pemformatan khusus. mengubah bilangan bulat menjadi representasi binernya sebagai string
Di mana itu meninggalkan kita? . (Tidak ada permainan kata-kata yang dimaksudkan. ) Mengingat bahwa kita diperbolehkan 8 bit, masing-masing dengan 2 pilihan, ada
Ini berarti bahwa setiap byte memetakan ke bilangan bulat antara 0 dan 255. Dengan kata lain, kita membutuhkan lebih dari 8 bit untuk menyatakan bilangan bulat 256. Anda dapat memverifikasi ini dengan memeriksa bahwa
57 adalah carriage return (bagian dari baris baru, pada sistem Windows)
Jika Anda memerlukan penyegaran pada heksadesimal, Kode Charles Petzold. Bahasa Tersembunyi adalah tempat yang tepat untuk itu. Hex adalah sistem penomoran berbasis 16 yang, alih-alih menggunakan 0 hingga 9, menggunakan 0 hingga 9 dan a hingga f sebagai digit dasarnya.
Terakhir, mari kembali ke awal, dengan urutan byte acak
Sekarang, bagaimana dengan contoh konkret? . com atau bit. ly yang mengubah URL yang berat menjadi sesuatu seperti https. //sedikit. ly/2IcCp9u. Kebanyakan shortener tidak melakukan hashing yang rumit dari input ke output;
Katakanlah setelah melihat Root Zone Database, Anda telah mendaftarkan situs tersebut. ly. Inilah fungsi untuk membantu Anda memulai dengan layanan Anda
Apakah ini ilustrasi nyata yang lengkap? . Saya akan bertaruh sedikit. ly melakukan hal-hal dengan cara yang sedikit lebih canggih daripada menyimpan tambang emasnya di kamus Python global yang tidak persisten di antara sesi
Catatan. Jika Anda ingin membuat pemendek URL lengkap milik Anda sendiri, periksa Buat Pemendek URL Dengan FastAPI dan Python
Namun, ini kira-kira akurat secara konseptual
>>> ________20______7
Tunggu. Satu hal yang mungkin Anda perhatikan adalah bahwa kedua hasil ini memiliki panjang 7 saat Anda meminta 5 byte. Tunggu, saya pikir Anda mengatakan hasilnya akan dua kali lebih lama? . Ada satu hal lagi yang terjadi di sini.
_82 menggunakan pengkodean base64, di mana setiap karakter adalah 6 bit data. (Ini 0 hingga 63, dan karakter yang sesuai. Karakternya adalah A-Z, a-z, 0-9, dan +/. )
_88 adalah bahwa ketiga fungsi tersebut semuanya mengambil beberapa bentuk input dan oleh karena itu tidak memenuhi definisi "acak" sejauh yang dilakukan UUID Versi 4
_98 menggunakan ID host mesin Anda dan waktu saat ini secara default. Karena ketergantungan pada waktu saat ini hingga resolusi nanodetik, versi ini adalah tempat UUID memperoleh klaim “keunikan yang dijamin sepanjang waktu. ”
30, mengubahnya menjadi integer big-endian, dan melakukan sejumlah operasi bitwise untuk mematuhi
Mudah-mudahan, sekarang Anda sudah memiliki gagasan bagus tentang perbedaan antara berbagai “jenis” data acak dan cara membuatnya. Namun, satu masalah lain yang mungkin terlintas dalam pikiran adalah tabrakan
Dalam hal ini, tabrakan hanya merujuk pada pembuatan dua UUID yang cocok. Apa peluangnya? . ada
Hash dirancang untuk menjadi pemetaan satu arah dari nilai input ke string ukuran tetap yang hampir tidak mungkin direkayasa balik. Dengan demikian, sementara hasil dari fungsi hash mungkin "terlihat seperti" data acak, itu tidak benar-benar memenuhi syarat di bawah definisi di sini
Rekap
Anda telah membahas banyak hal dalam tutorial ini. Sebagai rangkuman, berikut adalah perbandingan tingkat tinggi dari opsi yang tersedia bagi Anda untuk merekayasa keacakan dengan Python
Makalah mani di Mersienne Twister muncul pada tahun 1997, jika Anda menyukai hal semacam itu
Fungsi define untuk memilih secara acak dari himpunan kombinatorik, seperti dari kombinasi atau permutasi
mencakup berbagai generator sampel acak yang dapat digunakan untuk membangun kumpulan data buatan dengan ukuran dan kompleksitas yang terkontrol
Eli Bendersky menggali
>>> random.randrange(1,10)5
_3 dalam artikelnya
Pengantar Konkrit untuk Probabilitas menggunakan Python dari Peter Norvig juga merupakan sumber yang komprehensif
Pustaka Pandas menyertakan a yang dapat digunakan untuk menyetel keadaan acak sementara
Dari Stack Overflow
Menghasilkan Tanggal Acak Dalam Rentang yang Diberikan
Cara Tercepat untuk Menghasilkan String Unik Seperti Acak dengan Panjang Acak
Cara Menggunakan
>>> random.randrange(1,10)5
_9 pada Generator
Ganti Elemen Acak dalam Array NumPy
Mendapatkan Angka dari /dev/random dengan Python
Tandai sebagai Selesai
Tonton Sekarang Tutorial ini memiliki kursus video terkait yang dibuat oleh tim Real Python. Tonton bersama dengan tutorial tertulis untuk memperdalam pemahaman Anda. Menghasilkan Data Acak dengan Python
🐍 Trik Python 💌
Dapatkan Trik Python singkat & manis yang dikirim ke kotak masuk Anda setiap beberapa hari. Tidak pernah ada spam. Berhenti berlangganan kapan saja. Dikuratori oleh tim Real Python
Kirimi Saya Trik Python »
Tentang Brad Solomon
Brad adalah seorang insinyur perangkat lunak dan anggota Tim Tutorial Python Sejati
» Lebih lanjut tentang Brad
Setiap tutorial di Real Python dibuat oleh tim pengembang sehingga memenuhi standar kualitas tinggi kami. Anggota tim yang mengerjakan tutorial ini adalah
Adriana
Geir Arne
Joanna
Master Keterampilan Python Dunia Nyata Dengan Akses Tanpa Batas ke Python Nyata
Bergabunglah dengan kami dan dapatkan akses ke ribuan tutorial, kursus video langsung, dan komunitas pakar Pythonista
Tingkatkan Keterampilan Python Anda »
Guru Keterampilan Python Dunia Nyata Dengan Akses Tak Terbatas ke Real Python
Bergabunglah dengan kami dan dapatkan akses ke ribuan tutorial, kursus video langsung, dan komunitas ahli Pythonista
Tingkatkan Keterampilan Python Anda »
Bagaimana menurutmu?
Nilai artikel ini
Tweet Bagikan Bagikan Email
Apa takeaway # 1 Anda atau hal favorit yang Anda pelajari?
Kiat Berkomentar. Komentar yang paling berguna adalah yang ditulis dengan tujuan belajar dari atau membantu siswa lain. dan dapatkan jawaban atas pertanyaan umum di portal dukungan kami
Bagaimana cara Python menghasilkan angka acak?
Untuk menghasilkan angka acak dengan Python, randint() function digunakan. Fungsi ini didefinisikan dalam modul acak.
Bagaimana cara kerja sampel di Python?
sample() adalah fungsi bawaan dari modul acak di Python yang mengembalikan daftar panjang tertentu dari item yang dipilih dari urutan i. e. daftar, tuple, string atau set . Digunakan untuk pengambilan sampel acak tanpa penggantian. Parameter. urutan. Bisa berupa list, tuple, string, atau set.
Bagaimana Anda memilih sampel acak dari populasi dengan Python?
Jika Anda mengambil sampel dari populasi individu yang datanya direpresentasikan dalam baris tabel, maka Anda dapat menggunakan sampel metode Tabel untuk memilih baris tabel secara acak. .
Secara default, sampel diambil secara acak secara acak dengan penggantian
Apakah Python acak benar-benar acak?
Sebagian besar data acak yang dihasilkan dengan Python tidak sepenuhnya acak dalam pengertian ilmiahnya . Sebaliknya, itu adalah pseudorandom. dihasilkan dengan pseudorandom number generator (PRNG), yang pada dasarnya adalah algoritma apa pun untuk menghasilkan data yang tampaknya acak tetapi masih dapat direproduksi.