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:

Komentar



Postingan populer dari blog ini

Apps Script untuk Cetak Sertifikat

Kumpulan Source Code Greenfoot

Menyembunyikan Failed Load Images di Blogger

Kode Greenfoot Game Flappy Bird

Algorithma Bilangan Prima dengan Javascript

Checking Data yang Belum Dimasukkan dalam Daftar Menggunakan Query Google Sheet

Kebodohan Karyawan Menyalahkan Sistem

Algorithma Coretan Abstrak dengan HTML5 Canvas

Mencoba Submit Theme di Wordpress.org

Generate Karakter Acak dan Menempatkannya di Sel Google Sheets dengan Apps Script