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

Kumpulan Source Code Greenfoot

Algorithma Coretan Abstrak dengan HTML5 Canvas

Game TicTacToe dengan Greenfoot

Honeycomb Style Wallpaper dengan HTML5 Canvas

Cara Membuat Halaman HTML Sederhana

Kode Greenfoot Game Snake Sederhana

Melihat Alamat Berbentuk QR Code di Undangan Pernikahan

Algoritma Tombol Putar dengan Greenfoot

Tips Agar Website Anda Segera di Terima oleh Google Adsense dan di-Monetize

Selamatan Latar Glundengan Bubuk Banyuwangi