# Pembangkit Nama Acak Otomatis Berbasis Aturan Menggunakan Python

_Bismillaah Alhamdulillah_. 

Deretan nama dalam gambar di atas merupakan hasil pembangkitan otomatis yang disusun secara acak dari gabungan beberapa fail 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.

```python
import random
daftarNama = ("andi", "budi", "gunawan", "tanto", "rudi", "yanto", "sugeng")
```
Contoh pemanggilan pertama adalah mengambil satu nama secara acak dari _daftarNama_. Luaran yang dihasilkan bertipe _string_.
```python
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_.
```python
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.
```python
jmlNama = 3  
lstNama = random.sample(daftarNama, jmlNama)  
# lstNama berisi (contoh): ['tanto', 'sugeng', 'budi']
```
Kode sumber untuk penerapan tutorial di atas adalah sebagai berikut.

%[https://gist.github.com/galihboy/0d6318c54ff984e9f9743c6a59f7633b#file-nama_acak_v1-py]

Penggunaan _library_ **_random_** cukup mudah, dan masih ada fitur lain yang bisa dipelajari dan siapa tahu berguna buat Anda nantinya, silakan cek di laman web Python [¹](https://docs.python.org/3/library/random.html).

---

### 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 S_ubhanahu 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 [²](https://islam.nu.or.id/post/read/103702/ketentuan-pemberian-nama-anak-selain-nama-arab) [³](https://rumaysho.com/11876-hadiah-di-hari-lahir-15-bolehkah-memakai-nama-nabi-dan-malaikat.html). 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 daring yang membahas “_asmaul husna_” cukup banyak ditemukan [⁴](https://katadata.co.id/muchamadnafi/berita/60ae08b006237/asmaul-husna-99-arti-nama-nama-baik-allah-swt) [⁵](https://kangsantono.wordpress.com/2014/12/09/nama-islami-dari-asmaul-husna-dengan-penambahan-kata-abd-%D8%B9%D8%A8%D8%AF-untuk-bayi-laki-laki/) [⁶](https://alquran-indonesia.com/makna-asma-ul-husna-99-nama-allah/). 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.
```python
# huruf (string) awal nama asmaul husna yang dapat digabung  
karGabung = ("dh", "n", "r", "s", "sh", "sy", "t", "z")
```
Kode sumber lengkapnya adalah sebagai berikut.

%[https://gist.github.com/galihboy/4098be912ed7f3ac0be4ebc049d07bc0#file-nama_acak_v2-py]

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.
```python
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.
```python
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 peubah (_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)
```python
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.
```python
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, inventarisasi 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,
*   inventarisasi 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 fail eksternal

Sebelum melampirkan kode sumber lengkap, pada tahap terakhir ini saya ingin memberikan contoh pengaksesan data dari fail eksternal. Saya siapkan 5 fail sebagai berikut.
```python
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`.
```python
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.
```python
# 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_.

%[https://gist.github.com/galihboy/172f86c3f60f74807a154e48ddc99ab3#file-nama_acak_v3-py]

Contoh _screenshot_ dari hasil eksekusi kode sumber tersebut adalah sebagaimana terlihat pada gambar di bagian paling atas yang saya jadikan _cover image_.

Contoh variasi lain seperti terlihat pada gambar di bawah ini dapat dilihat di _repository Github_.

%[https://github.com/galihboy/Nama_Acak]

Berikut contoh luaran aplikasi.
![](https://cdn.hashnode.com/res/hashnode/image/upload/v1636797046233/nrttEVE0K.jpeg)

Bagi yang ingin mencoba aplikasi secara langsung (online) silakan cek di sini.

[https://galihboy.github.io/mini\_projects/](https://galihboy.github.io/mini_projects/)

Demikian tutorial pembangkitan nama secara otomatis dan berbasis aturan. Semoga bermanfaat.

Terima kasih.

😉🙏❤️

**Bacaan**

1.  [https://docs.python.org/3/library/random.html](https://docs.python.org/3/library/random.html)
2.  [https://islam.nu.or.id/post/read/103702/ketentuan-pemberian-nama-anak-selain-nama-arab](https://islam.nu.or.id/post/read/103702/ketentuan-pemberian-nama-anak-selain-nama-arab)
3.  [https://rumaysho.com/11876-hadiah-di-hari-lahir-15-bolehkah-memakai-nama-nabi-dan-malaikat.html](https://rumaysho.com/11876-hadiah-di-hari-lahir-15-bolehkah-memakai-nama-nabi-dan-malaikat.html)
4.  [https://katadata.co.id/muchamadnafi/berita/60ae08b006237/asmaul-husna-99-arti-nama-nama-baik-allah-swt](https://katadata.co.id/muchamadnafi/berita/60ae08b006237/asmaul-husna-99-arti-nama-nama-baik-allah-swt)
5.  [https://kangsantono.wordpress.com/2014/12/09/nama-islami-dari-asmaul-husna-dengan-penambahan-kata-abd-%D8%B9%D8%A8%D8%AF-untuk-bayi-laki-laki/](https://kangsantono.wordpress.com/2014/12/09/nama-islami-dari-asmaul-husna-dengan-penambahan-kata-abd-%D8%B9%D8%A8%D8%AF-untuk-bayi-laki-laki/)
6.  [https://alquran-indonesia.com/makna-asma-ul-husna-99-nama-allah/](https://alquran-indonesia.com/makna-asma-ul-husna-99-nama-allah/)

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1636797047935/5r0J_UVsM.gif)
