Masalah dan Solusi Random di C++
Dalam bahasa pemrograman C++, penggunaan fungsi random (acak) tidak semudah yang penulis bayangkan.
Untuk menggenerate nilai acak 0.0 sampai 1.0, memang menghasilkan nilai random,
Tetapi di C++ selalu menghasilkan urutan angka acak yang sama bahkan ketika program dijalankan mulai lagi dari awal.
Kode di bawah ini adalah contoh kode C++ untuk menggenerate angka acak menggunakan fungsi rand() untuk menggenerate bilangan acak bulat dan asli.
#include <iostream> #include <time.h> using namespace std; double doubleRand() { return double(rand()) / (double(RAND_MAX) + 1.0); } int main(int argc, char *argv[]) { timeval time; gettimeofday(&time, NULL); long millis = (time.tv_sec * 1000) + (time.tv_usec / 1000); for(int i=0;i<10;i++){ cout<<rand()<<" "<<doubleRand()<<" "<<time<<endl; } return 0; }
Fungsi rand() sendiri menghasilkan bilangan acak integer (bulat). Dan dengan membagi dengan nilai random maksimum RAND_MAX, lalu mengubahnya ke bentuk bilangan double (asli), seperti dalam fungsi doubleRand(), akan didapatkan urutan angka acak dalam bentuk bilangan asli mulai 0.0 sampai 1.0.
Untuk menggenerate nilai random di C++, berdasarkan beberapa sumber yang menyarankan penggunaan variabel waktu, penulis merekomendasikan untuk menambahkan nilai miliseconds sebagai pengali hasil generate rand().
Kode dibawah ini adalah kode untuk mendapatkan nilai miliseconds menggunakan library chrono.
auto now = Clock::now(); auto seconds = chrono::time_point_cast<chrono::seconds>(now); auto fraction = now - seconds; time_t cnow = Clock::to_time_t(now); auto milliseconds = chrono::duration_cast<chrono::milliseconds>(fraction);
Untuk mendapatkan nilai random 0.0 sampai 1.0, nilai miliseconds perlu dibagi dengan 1000, dan digunakan sebagai faktor pengali, sebagaimana penulis implementasikan dalam kode di bawah ini:
#include <iostream> #include <chrono> using namespace std; typedef chrono::system_clock Clock; double doubleRand() { return double(rand()) / (double(RAND_MAX) + 1.0); } double doubleRand2() { auto now = Clock::now(); auto seconds = chrono::time_point_cast<chrono::seconds>(now); auto fraction = now - seconds; time_t cnow = Clock::to_time_t(now); auto milliseconds = chrono::duration_cast<chrono::milliseconds>(fraction); return ((1.0*rand() / RAND_MAX)*(1.0*milliseconds.count()/1000)); } int main(int argc, char *argv[]) { for(int i=0;i<10;i++){ cout<<rand()<<" "<<doubleRand()<<" "<<doubleRand2()<<endl; } return 0; }
Gambar di bawah ini adalah screenshot hasil running kode di atas.
Penulis menggunakan compiler MinGW yang dapat di download di sini.
Referensi:
- Cplusplus. 2019. std::chrono::milliseconds. http://www.cplusplus.com/reference/chrono/milliseconds/. Diakses tanggal 27 September 2019.
- MinGW. 2019. Minimalist GNU for Windows. http://www.mingw.org/. Diakses tanggal 27 September 2019.
Komentar
Posting Komentar