Setelah sekian lama tidak nge-posting, kali ini saya akan membagikan tips tentang bagaimana caranya mengacak angka atau randomize. Terinspirasi dari soal UAS Algoritma & Pemrograman pada tanggal 7 February kemarin, kali ini saya akan menjelaskan proses random atau acak angka dalam bahasa C.

Dalam bahasa C, terdapat fungsi tersendiri untuk mengacak angka yang bernama rand(). Sebagai sebuah fungsi bawaan dari bahasa C, tentunya fungsi rand() tersebut mempunyai header dong. Fungsi tersebut terdapat di dalam header <stdlib.h>.

Nah setelah berbasa-basi sedikit mengenai siapa rand(), berikut adalah penerapan nya dalam bentuk code :


Maka beginilah output nya :


      Scaling : Apa sih scaling? Lalu buat apa sih?
Agar gampang dimengerti, fungsi rand() itu akan mengembalikan sebuah nilai integer. Namun, nilai yang di return itu bervariasi mulai dari 0 sampai sekian sekian sekian (saya sendiri belum tahu pasti max nilai yang di return). Nah, dalam kehidupan sehari-hari, angka yang ingin kita acak memiliki nilai minimal dan maksimal tersendiri.

Contoh : jika kita ingin membuat program mengacak dadu, maka kita hanya perlu mengacak nilai dari 1 sampai 6. Nah disinilah peran Scaling, yaitu membatasi nilai yang akan diacak.

Lalu, apa gunanya % 6 + 1 pada code di atas?
Begini, kalian pasti sudah pada tahu apa itu modulus pembagian atau yang sering disebut mod (% dalam bahasa C).
Buat yang belum tahu, mod itu adalah hasil bagi dari suatu operasi pembagian 2 buah bilangan.
Misal:
10 % 5 hasilnya adalah 0, karena 10 HABIS dibagi oleh 5
10 % 4 hasilnya adalah 2, karena 10 TIDAK HABIS dibagi oleh 4 dan menyisakan 2.

Dari penjelasan di atas kita sudah mengerti apa itu modulus dan dengan kata lain, hasil dari operasi mod suatu bilangan PASTI tidak lebih besar dari bilangan pembagi.
Misal : X % 3, berapapun nilai X, hasil nya pasti selalu di bawah 3, entah itu 0 atau 1 atau 2
Nah dari situ kita bisa tahu apa fungsi dari  + 1  bukan?
Benar sekali, karena hasil nya dari 0 sampai angka n-1 (n adalah bilangan pembagi) maka kita perlu menambahkan satu agar range bilangan yang diacak dimulai dari 1 sampai n.

Nah, mudah kan.
*Wah, ternyata Random itu gak sesulit seperti yang di bayangkan toh
Betul
*Thanks ya gan, berarti saya sudah bisa melakukan random donk
Eits, jangan senang dulu, itu masih kurang lengkap bos
*Lho? apanya yang kurang lengkap?
Simak baik-baik ya
*Oke deh

Coba kalian ulangin program di atas sekali, dua kali, dan seterusnya.
Kalian pasti menemukan suatu ke anehan
*Wah iya, saya ulang terus menerus, tapi kok angka ke 1 sampai ke 10 nya itu-itu terus ya?

Nah untuk itu kita memerlukan seed.
Fungsi rand() itu akan memerlukan seed untuk melakukan random, apa itu seed?
Seed itu adalah titik awal dimana random dimulai.

Jika kalian pernah berkumpul di kelas, lalu mengadakan undian dengan cara memutar pulpen, dan jika pulpen tersebut mengarah ke salah satu peserta, maka peserta tersebut akan menang atau dihukum.

Seed itu ibaratnya adalah posisi awal dari sebuah pulpen tersebut, jika terdapat 5 orang, yaitu A,B,C,D,E.
Jika pada undian yang pertama, posisi awal pulpen menghadap ke arah A, dan setelah putaran dilakukan ternyata yang kena adalah B

*Wah, si B kena hukum donk, apa hukuman nya

Kita tidak akan membahas hal tersebut disini, dan jika undian kedua dilakukan, jika posisi awal tetap menghadap ke A dan jika pulpen di putar ke arah dan tenaga yang sama seperti putaran pertama, pulpen tersebut sudah pasti kembali menghadap ke arah B bukan?

Begitu pula dengan rand(), fungsi ini mempunyai seed default, sehingga setiap kali kita mengulang program tersebut, maka hasil nya akan selalu sama.

*Bagaimana dong supaya hasil nya gak sama terus?

Kita memerlukan fungsi tambahan yang bernama srand().
srand() adalah fungsi untuk menentukan seed atau posisi awal dalam sebuah pengacakan.
Kita hanya perlu menggunakan srand() sekali saja, yaitu sebelum fungsi rand() dipanggil.

Syntax : srand(seed_number);

seed_number bisa diganti dengan angka yang diinginkan maupun dengan variabel integer yang nilai nya bisa di input sendiri oleh user, namun sama halnya seperti konsep diatas.
Jika user memasukan seed_number yang sama, maka hasil pengacakan nya juga memiliki pola yang sama

*Terus saya harus bagaimana?

Nah untuk itu, kita perlu memakai fungsi time(NULL) dari header <time.h>.
*Itu fungsi apalagi mas?

Fungsi time(NULL) adalah fungsi yang mengembalikan nilai sesuai dengan banyak nya detik sejak tanggal 1 January 1970 yang artinya bisa dipakai sebagai seed_number. Mengapa? karena jika saya menjalankan program pada jam 7 malam lalu saya akan menjalankan nya kembali pada pukul 7.30 malam, total detik yang dihitung sejak 1 Januari 1970 itu pasti sudah berbeda. Oleh karena itu, kemungkinan seed_number sama tidak akan terjadi karena waktu yang terus berjalan sehingga membuat jumlah detik nya menjadi berbeda.

Berikut adalah contoh code nya :


Berikut adalah output ketika program pertama kali di jalankan :


   Berikut adalah output nya ketika program dijalankan kembali :















Sangat berbeda bukan?
Sekian tips dari saya seputar melakukan random sederhana pada bahasa C.

Terima kasih

Post a Comment