Skip to content

Menghasilkan Nilai Acak dengan Seed : Fortran 90

April 21, 2012

Pada simulasi sains, sering kali dibutuhkan sederetan nilai random , atau acak untuk mensimulasikan kondisi sebenarnya sebagai input. Disini di bahas sedikit mengenai penulisan kode Fortran 90 untuk menghasilkan nilai acak. Fortan 90 sendiri telah memiliki rutin intrinsik untuk menghasilkan nilai acak yang terdistribusi secara seragam atau uniform antara rentang 0-1 yaitu RANDOM_NUMBER(). Permasalahannya, setiap kali kita memanggil nilai tersebut, selalu menghasilkan nilai-nilai acak yang sama. Bahkan jika kita berpindah ke mesin yang lain, tetap, dihasilkan deretan nilai-nilai acak yang sama, hmm, apakah bisa di sebut acak?.

Penghasil nilai acak yang merupakan fitur dari Fortran 90 ini, tidak memberikan spesifikasi dari algortima untuk menghasilkan nilai acak. Namun, kita bisa mengunakan seed sebagai start-up, sehingga nilai acak yang dihasilkan tidak akan sama lagi. Oleh karenanya, seed semestinya dibuat dinamik, sehingga setiap kali nilai acak yang dihasilkan tidak akan sama. Untuk lebih detail mengenai seed yang akan digunakan adalah RANDOM_SEED(), baiknya baca dokumentasi gnu ini.

Sebenarnya, Fortran sendiri telah menyediakan seed secara default, namun nilainya tetap. Disini kita akan memanfaatkan rutin instrinsik dari Fortran 90, yaitu DATE_AND_TIME() sebagai seed, dengan anggapan waktu berjalan selalu maju, sehingga ketika kita me-run lagi di lain kesempatan, hasilnya akan berbeda. Resolusi dari fitur DATE_AND_TIME() ini adalah satu milidetik. Untuk lebih detail mengenai rutin DATE_AND_TIME(), baiknya baca dokumentasi oracle ini.

Anyway, pembelajaran akan lebih baik jika kita mencobanya sendiri.🙂

 PROGRAM NilaiAcak

IMPLICIT NONE
REAL                               :: nilaiRand
REAL, DIMENSION(10)                :: nilaiRandArray
INTEGER                            :: ukuranSeed
INTEGER, DIMENSION(:), ALLOCATABLE :: seed
INTEGER, DIMENSION(8)              :: nilai_datetime !VALUES dari DATE_AND_TIME() adalah array dengan 8 elemen

!-- Rutin:  DATE_AND_TIME([DATE, TIME, ZONE, VALUES])
! Coba print value dari DATE_AND_TIME yang tersimpan dalam parameter internal VALUES
! kita ambil nilai internal VALUES ke dalam variabel kita (nilai_datetime)

CALL DATE_AND_TIME(VALUES=nilai_datetime)
WRITE (*,*) 'Nilai VALUES:', nilai_datetime

!-- Rutin: RANDOM_SEED([SIZE, PUT, SEED])
! Coba kita cek, berapa ukuran dari SEED?

CALL RANDOM_SEED(SIZE=ukuranSeed)
WRITE (*,*) 'Ukuran SEED: ', ukuranSeed

!-- Pura-puranya, kita tidak tahu ukuran SEED, untuk mencegah kesalahan:
! ukuran seed yang lebih kecil tidak akan masalah, karena nilainya akan dicopy begitu saja

IF(ukuranSeed > 8) THEN
 WRITE (*,*) 'ERROR: Ukuran SEED terlalu besar, maaf anda harus return'
 STOP
ENDIF

!-- Ok, sekarang kita tahu ukuran seed, alokasikan untuk seed buatan kita

ALLOCATE(seed(ukuranSeed))

!-- GET merupakan parameter internal untuk mengetahui nilai dari seed, well, cek seed awal, sebelum diubah

CALL RANDOM_SEED(GET=seed)
WRITE (*,*) 'SEED lama: ', seed

!-- Sekarang update SEED, taruh SEED dengan DATE_AND_TIME() tadi
!-- PUT merupakan variabel internal input untuk menaruh nilai seed

CALL RANDOM_SEED(PUT=nilai_datetime)

!-- Sekarang, cek nilai seed, apakah sudah terupdate?

CALL RANDOM_SEED(GET=seed)
WRITE (*,*) 'SEED baru: ', seed

!-- Rutin : RANDOM_NUMBER(HARVEST)
!-- Sekarang panggil nilai random, satu, sebagai contoh

nilaiRand = 0.d0
CALL RANDOM_NUMBER(nilaiRand)
WRITE (*,*) 'Nilai random: ', nilaiRand

!-- Sekarang panggil nilai random sepuluh sekaligus, dalam array
nilaiRandArray = 0.d0
CALL RANDOM_NUMBER(nilaiRandArray)
WRITE (*,*) 'Nilai random array: ', nilaiRandArray

ENDPROGRAM NilaiAcak

Program di atas memang terkesan panjang, sebetulnya esensi dari mendapatkan nilai acak dengan seed DATE_AND_TIME() sedikit, bahkan bisa dengan tiga baris. Namun, ekspektasi saya terhadap pembaca adalah pembaca memahami mekanisme di dalamnya.

Setelah program di-compile, eksekusi, output akan berupa:



Selamat mencoba.🙂

No comments yet

Tinggalkan Balasan

Isikan data di bawah atau klik salah satu ikon untuk log in:

Logo WordPress.com

You are commenting using your WordPress.com account. Logout / Ubah )

Gambar Twitter

You are commenting using your Twitter account. Logout / Ubah )

Foto Facebook

You are commenting using your Facebook account. Logout / Ubah )

Foto Google+

You are commenting using your Google+ account. Logout / Ubah )

Connecting to %s

%d blogger menyukai ini: