Mengacak Bilangan

Bahasa C maupun C++ menyediakan function untuk mengacak bilangan. Function tersebut adalah rand yang ada di dalam library <math.h>. Jika kalian menggunakan C++, kalian juga bisa menggunakan cmath.

Function rand menampilkan bilangan bulat yang terkesan acak setiap kali function tersebut dipanggil. Bilangan-bilangan acak tersebut disebut dengan pseudo random number.

#include <math.h>
#include <stdio.h>

int main(){
    for(int i=0;i<5;i++)printf("%d\n", rand());
    return 0;
}

Walaupun terkesan acak, angka-angka yang dihasilkan function rand() bisa saja terlihat sama setiap kali program dijalankan. Untuk mengubah nilai awal yang dihasilkan rand, kalian perlu menggunakan function srand().

#include <math.h>
#include <stdio.h>

int main(){
    srand(2);
    for(int i=0;i<5;i++)printf("%d\n", rand());
    return 0;
}

Nilai argumen yang sama pada parameter srand akan menghasilkan rangkaian angka yang sama. Kalian perlu mengubah argumen function srand untuk mendapatkan sekumpulan angka yang berbeda saat menggunakan rand. 

Function Time

Untuk membuat argumen srand selalu berubah, kalian bisa menggunakan waktu. Dalam bahasa C maupun C++, kalian bisa menggunakan function time untuk mendapatkan selisih waktu dari "standar waktu minimum" yang ada di BIOS atau semacamnya. Function time() ada di dalam <time.h>.

#include <stdio.h>
#include <time.h>

int main(){
    time_t waktu;
    srand(time(&waktu));
    for(int i=0;i<5;i++)printf("%d\n", rand());
    return 0;
}
Contoh Output :
250015796
229669843
1989679917
987338549
1986627748

Setiap kali program dijalankan, bilangan-bilangan yang dihasilkan function rand seharusnya berbeda karena nilai yang dikembalikan function time selalu berubah.

Membatasi Bilangan yang Diacak

Bilangan yang diacak bisa dibatasi nilai maksimumnya dengan menggunakan modulus. Modulus akan membuat hasil perhitungan suatu angka berada di bawah nilai pembaginya. Contohnya bisa kalian lihat di bawah ini.
#include <math.h>
#include <stdio.h>
#include <time.h>
#define batas 5

int main(){
    time_t waktu;
    
    srand(time(&waktu));
    for(int i=0;i<5;i++)printf("%d\n", rand()%batas);
    return 0;
}
Contoh Output :
4
4
0
3
1

Contoh di atas membatasi nilai kembalian dari rand supaya berada di antara 0 s.d 4 karena ada mod dengan angka 5. Sisa hasil bagi akan selalu kurang dari nilai pembagi. Contoh di atas menggunakan konstanta yang diberi nama batas. Untuk lebih jelasnya, kalian bisa mengganti nilai batas dengan angka lainnya. 

Mendapatkan Bilangan Acak Negatif

Untuk mendapatkan bilangan acak negatif, kalian cukup melakukan pengurangan sesuai nilai negatif yang kalian inginkan.
#include <math.h>
#include <stdio.h>
#include <time.h>
#define batas 10

int main(){
    time_t waktu;
    
    srand(time(&waktu));
    for(int i=0;i<5;i++)printf("%d\n", rand()%batas-5);
    return 0;
}
Contoh Output :
-4
-1
4
3
0

Nilai acak pada contoh di atas batas nilai terkecilnya adalah -5. Kalian bisa mengganti angka 5 dengan angka lain sesuai batas nilai negatif yang kalian inginkan. 

Rentang nilai bilangan yang diacak akan tetap sama. Itu membuat batas maksimal nilai positif akan bergeser. Jika nilai batas 10 dan nilai minimumnya -5, maka nilai maksimumnya adalah "10-5-1=4".

Mengacak Indeks Array

Nilai acak yang dibatasi bisa digunakan untuk mengacak indeks array. Contoh penerapan bilangan acak untuk mengacak indeks array bisa kalian lihat di bawah ini.

#include <cmath>
#include <iostream>
#include <time.h>

using namespace std;

int main(){
 time_t t;
   int n;

 //
 srand(time(&t));
 
 for(int i=0;i<4;i++){
     n=rand() % 62; 
    // Batasi angka maksimal jadi 61 (atau 62-1), ganti sesuai banyaknya karakter dalam array yg dipakai.

     cout << n << endl; 
    // Lihat nilai n, n bisa dipakai untuk indeks array yg diacak.
 }
}