Pembangkit Nama Acak Otomatis Berbasis Aturan Menggunakan Python

Galih Hermawan
7 min readOct 16, 2021
Screenshot by Author

Bismillaah Alhamdulillah,

Deretan nama dalam gambar di atas merupakan hasil pembangkitan otomatis yang disusun secara acak dari gabungan beberapa file teks yang berisi nama.

Apa maksudnya berbasis aturan?

Bahwa pemerolehan nama tidak serta merta dilakukan hanya dengan sekadar mengacak data dari daftar nama, tapi ada nama-nama tertentu yang dalam penyusunannya mengikuti aturan yang telah ditetapkan. Begitu juga dalam pembangkitan nama dapat disesuaikan dengan aturan sendiri dari pengguna, jumlah kata (nama) yang diinginkan, apakah nama acak semua atau disertai nama permanen (atau tetapan).

Dalam artikel ini selanjutnya akan saya sampaikan pembahasan dari tahap paling dasar hingga jadi seperti aplikasi utuh yang siap digunakan.

Tahap 1. Tutorial dasar penggunaan fungsi Random

Salah satu paket (library) dalam Python untuk mengambil data secara acak dari sekumpulan data bernama Random. Berikut potongan kode untuk mengimpor library dan membuat contoh data (tuple) berisi nama.

import randomdaftarNama = ("andi", "budi", "gunawan", "tanto", "rudi", "yanto", "sugeng")

Contoh pemanggilan pertama adalah mengambil satu nama secara acak dari daftarNama. Luaran yang dihasilkan bertipe string.

stringNama = random.choice(daftarNama)
# stringNama berisi (contoh): 'andi'

Yang kedua adalah mengambil nama dari daftarNama dengan tipe luaran berupa list. Pemanggilan dapat dilakukan beberapa kali yang jumlahnya diletakkan setelah parameter ‘k’. Luaran berupa list.

lstNama = random.choices(daftarNama, k=3)
# lstNama berisi (contoh): ['rudi', 'gunawan', 'gunawan']

Pada contoh di atas, isi list bisa jadi berisi data kembar dikarenakan method random.choices dengan k=3 itu bermakna jumlah pengacakan dilakukan sebanyak 3 kali. Serta tidak menjamin data yang diperolehnya acak (unik). Adapun untuk memperoleh sejumlah data secara unik adalah dengan menggunakan method random.sample, contohnya adalah sebagai berikut.

jmlNama = 3
lstNama = random.sample(daftarNama, jmlNama)
# lstNama berisi (contoh): ['tanto', 'sugeng', 'budi']

Kode sumber untuk penerapan tutorial di atas adalah sebagai berikut.

Penggunaan library random cukup mudah, dan masih ada fitur lain yang bisa dipelajari dan siapa tahu berguna buat Anda nantinya, silakan cek di website Python ¹.

Tahap 2. Contoh pemrosesan nama berbasis aturan

Dalam agama Islam, terdapat beberapa panduan dalam memberikan nama pada seseorang. Beberapa di antaranya adalah memberikan nama harus dengan nama yang (mengandung arti) baik, mengandung do’a kebaikan, terdapat nama yang bermakna hamba Tuhan Allah Subhanahu wa Ta’ala (misal; nama ‘Abdul’ ditambah nama Allah yang baik atau asmaul husna), nama Nabi, sahabat Nabi, atau orang-orang shalih zaman dahulu dengan harapan supaya bisa menjadi orang baik sesuai nama yang disandangnya, dan berbagai panduan lainnya. Terdapat berbagai sumber jika kita mau menelusurinya ² ³. Untuk kebiasaan atau tata tertib pemberian nama di agama lain, kebudayaan, atau daerah lain mungkin juga ada; hal ini dapat disesuaikan nantinya.

Salah satu aturan yang akan coba kita terapkan di sini adalah penggunaan nama “Abdul” yang berarti ‘hamba’. Penggunaan nama “Abdul” yang paling sesuai adalah dengan disandingkan dengan “asmaul husna”, contohnya adalah sebagai berikut.

# sebelah kiri panah adalah nama asmaul husna dan artinya
# sebelah kanan panah adalah contoh penggunaan untuk nama orang
Ar Rahman (Yang Maha Pengasih) -> Abdul Rahman atau Abdurrahman
Ar Rahim (Yang Maha Penyayang) -> Abdul Rahim atau Abdurrahim
Al Wahhab (Yang Maha Pemberi Karunia) -> Abdul Wahhab
As Salam (Yang Maha Pemberi Kesejahteraan) -> Abdul Salam atau Abdussalam
... dst.

Artikel online yang membahas “asmaul husna” cukup banyak ditemukan . Anda dapat menelusuri dan mengkajinya lebih lanjut.

Nama “Abdul” tidak dapat berdiri sendiri, ini salah satu aturan yang akan kita gunakan. Kemudian juga tidak dapat dipasangkan dengan nama biasa yang tidak mencirikan sifat Allah yang agung. Jadi, aturan dasarnya sebagai berikut.

# aturan 1
nama = hasil pengacakan dengan jumlah 1 kata (nama)
jika nama yang ditemukan mengandung kata "abdul", lakukan pengacakan lagi
# aturan 2
nama = hasil pengacakan dengan jumlah 2 kata (nama)
- jika ditemukan nama "abdul" pada kata terakhir, ikuti aturan 1
- sebaliknya, jika ditemukan pada kata pertama, maka kata pertama diisi "abdul" dan kata kedua diambil dari nama acak yang terdapat dalam daftar nama asmaul husna.

Berikutnya adalah aturan penggabungan nama “abdul” dengan “asmaul husna”. Contoh nama yang dapat digabung adalah: Abdul Rahim menjadi Abdurrahim, Abdul Rahman menjadi Abdurrahman, dst. Tapi ada juga yang tidak dapat digabung, seperti: Abdul Wahhab, Abdul Ghaniy, dst.

Sementara ini, aturan yang dapat kita terapkan adalah nama asmaul husna yang berawalan karakter atau string berikut, ada kemungkinan digabung menjadi satu kata (nama) “bagi yang mau”. Kenapa begitu? Karena dalam kenyataannya penggunaan nama ini tergantung selera masing-masing orang.

# huruf (string) awal nama asmaul husna yang dapat digabung
karGabung = ("dh", "n", "r", "s", "sh", "sy", "t", "z")

Kode sumber lengkapnya adalah sebagai berikut.

Dari kode tersebut di atas, kita sudah dapat membangkitkan nama acak sejumlah yang kita inginkan berdasarkan daftar nama yang kita punyai.

Tahap 3. Kustomisasi pembangkitan nama acak

Pada bagian ketiga ini, kita ingin membuat pembangkitan nama lebih dapat disetel (customize) sedemikian rupa sesuai dengan aturan yang kita buat sendiri. Misalkan kita ingin membangkitkan nama berisi 3 (kata) nama, dimana kata pertama harus berisi “Muhammad”, kata kedua dan kata ketiga bebas. Atau contoh lain, kita ingin membangkitkan 4 (kata) nama, dimana kata pertama bebas, kata kedua harus berisi “Abdul”, kata ketiga bebas, dan kata keempat berisi “Hermawan”.

Kalau kita tetapkan misalnya sebuah parameter yang mewakili nama acak adalah karakter (string) “x”, maka desain atau format nama lengkapnya adalah sebagai berikut.

strFormat_contoh_1 = "Muhammad X X"strFormat_contoh_2 = "X Abdul X Hermawan"

Langkah-langkahnya adalah:

a. Menginventarisir nama sesuai (dalam) format.

Nama selain “X” kita anggap sebagai suatu tetapan yang tidak bisa diubah. Kita dapat masukkan ke penyimpanan khusus nama-nama yang tidak bisa diubah dan jangan sampai dibangkitkan jika terdapat dalam daftar nama. Misalkan kita beri nama lstBlokir (list blokir). Sedangkan untuk nama dalam posisi “X”, kita hafal dan simpan nomor indeksnya.

strFormat_1 = "Muhammad X X"
lstBlokir_1 = ['Muhammad']
lstIndeks_X_1 = [[1,1], [2,0]]
strFormat_2 = "X Abdul X Hermawan"
lstBlokir_2 = ['Abdul', 'Hermawan']
lstIndeks_X_2 = [[0,2], [2,0]]

Perhatikan isi dari perubah (variable) lstIndeks_X_1 dan lstIndeks_X_2 yang digunakan untuk menampung dua hal, yaitu nomor indeks ‘X’ dan jarak dengan ‘X’ berikutnya. Untuk lstIndeks_X_1 dengan nilai [[1,1], [2,0]] berarti ‘X’ ditemukan pada indeks ke-1 dengan jarak ke indeks ‘X’ berikutnya adalah 1. Dan juga ditemukan pada indeks ke-2 dengan jarak dengan ‘X’ berikutnya 0 (karena tidak ditemukan).

Sedangkan pada lstIndeks_X_2 dengan nilai [[0,2], [2,0]] berarti ‘X’ ditemukan pada indeks ke-0 dengan jarak ke indeks ‘X’ berikutnya adalah 2. Dan juga ditemukan pada indeks ke-2 dengan jarak dengan ‘X’ berikutnya 0 (karena tidak ditemukan).

b. Berikutnya adalah kita evaluasi atau hitung mana nama dalam ‘X’ yang berkumpul, dan mana dipisahkan oleh nama tetapan. Misal kita simpan dalam sebuah lstJarak (list jarak)

strFormat_1 = "Muhammad X X"
lstIndeks_X_1 = [[1,1], [2,0]]
lstJarak_1 = [[1, 2]]
strFormat_2 = "X Abdul X Hermawan"
lstIndeks_X_2 = [[0,2], [2,0]]
lstJarak_2 = [[0,1], [2,1]]

Dalam lstJarak_1 = [[1, 2]] bermakna ‘X’ ditemukan 2 kali berturut-turut dari indeks ke-1, yaitu indeks 1 dan 2. Sedangkan dalam lstJarak_2 = [[0,1], [2,1]] ditemukan ‘X’ pada indeks ke-0 hanya 1 buah saja, dan pada indeks ke-2 juga hanya 1 buah saja.

Jadi logikanya, berdasarkan rekaman jarak indeks tersebut, kita dapat membangkitkan nama acak serta menempatkan kembali sesuai dengan alamat indeks yang sudah kita simpan. Berikut adalah gambarannya.

strFormat_1 = "Muhammad X X"
lstJarak_1 = [[1, 2]]
... bangkitkan 2 nama acak dan letakkan pada indeks 1 dan 2
strFormat_2 = "X Abdul X Hermawan"
lstJarak_2 = [[0,1], [2,1]]
... bangkitkan 2 nama acak dan letakkan satu nama pada indeks 0 dan satu nama pada indeks 2

Selain mendesain metode pembangkitan nama, inventarisir indeks, dan lain sebagainya; urutan peletakan metode juga sangat penting diperhatikan. Dalam hal ini saya akan memodifikasi urutan penerapan metode serta mengubah cara validasi nama yang mengandung nama “abdul”.

  • pembangkitan nama acak dengan jumlah tertentu,
  • cek ke daftar nama yang diblokir, ulangi ke poin pertama jika ditemukan nama yang terblokir,
  • inventarisir nilai indeks nama berdasarkan daftar nama yang dibangkitkan,
  • keluarkan nama yang sudah dibangkitkan,
  • cek nama dengan mengikuti aturan validasi nama “abdul”,
  • keluarkan nama final yang sudah fixed.

Tahap 4. Pemanggilan nama dari daftar nama yang tersimpan di file eksternal

Sebelum melampirkan kode sumber lengkap, pada tahap terakhir ini saya ingin memberikan contoh pengaksesan data dari file eksternal. Saya siapkan 5 file sebagai berikut.

namaFileAsmaulHusna = "nama_asmaul_husna.txt"
namaFileLaki = "nama_laki.txt"
namaFileNabi = "nama_nabi.txt"
namaFileSahabat = "nama_sahabat_nabi.txt"
namaFileIslam = "nama_islam.txt"

Penjelasan dari file di atas adalah:

  • nama_asmaul_husna.txt → terdapat 99 data nama asmaul husna,
  • nama_laki.txt → contoh data nama laki-laki pada umumnya,
  • nama_nabi.txt = terdapat 25 data nama nabinya yang umum dikenal oleh ummat Islam,
  • nama_sahabat_nabi.txt → terdapat sedikit contoh nama sahabat nabi,
  • nama_islam.txt → terdapat sedikit contoh nama-nama Islami

Berikutnya saya manfaatkan library membaca file dari proyek-proyek kecil terdahulu yang juga ada di repository Github, bernama libBerkas.py.

daftarAsmaulHusna = BacaBerkas(namaFileAsmaulHusna)
daftarNamaLaki = BacaBerkas(namaFileLaki)
daftarNamaNabi = BacaBerkas(namaFileNabi)
daftarNamaSahabat = BacaBerkas(namaFileSahabat)
daftarNamaIslam = BacaBerkas(namaFileIslam)

Untuk menjadikan daftar nama tersebut di atas sebagai sumber referensi data adalah contohnya sebagai berikut.

# contoh penetapan dari satu sumber data
#sumber = daftarNamaLaki
#sumber = daftarNamaIslam

# contoh sumber data gabungan
#sumber = daftarNamaNabi + daftarNamaIslam
sumber = daftarNamaLaki + daftarNamaSahabat + daftarNamaIslam

Pilih salah satu saja, atau silakan meramu data sumber sendiri sesuai keinginan.

Dan terakhir memanfaatkan metode pengambilan nama acak, misalnya:

nama = CetakNama(sumber, strFormat, charAcak)
namaBaru = ValidasiAbdul(sumber, nama, strFormat, charAcak, True)
print(f"{i+1}. {namaBaru}")

Berikut ini contoh kode sumber yang sudah menerapkan metode dan aturan-aturan yang sudah kita bahas sebelumnya. Dibuat sedemikian rupa agar dapat dipanggil secara mandiri (standalone) maupun sebagai library.

Contoh screenshot dari hasil eksekusi kode sumber tersebut adalah sebagaimana terlihat pada gambar di bagian paling atas yang saya jadikan feature image.

--

--

Galih Hermawan

Lecturer and Researcher. Informatics Engineering. UNIKOM. New blog https://blog.galih.eu