Dari definisi Sebenarnya True Random Number Generator (TRNG) adalah bilangan acak yang tidak bersifat algoritmik/memiliki aturan tertentu. Sehingga data yang di-generate/hasilkan tidak saling berkorelasi dan bergantung terhadap faktor tertentu (misal waktu, state, seed/nilai awal, dll).
Hal ini hampir tidak mungkin (minimal Sangat Sulit) untuk ditemukan/lakukan dan tidak "praktis" untuk digunakan dalam berbagai aplikasi dalam keseharaian.
Contoh TRNG biasanya pada lab fisika dengan menggunakan special device berdasarkan physical randomness. Namun beberapa tahun ini mulai jamak alat-alat TRNG yang berifat lebih portable (usb devices).
Namun untuk mengenerate bilangan random dengan cara ini sangatlah tidak praktis. Pencatatan setiap even ke data sangatlah tidak efisien dikarenakan simulasi yang menggunakan bilangan random ini biasanya membutuhkan data dalam jumlah yang sangat besar.
Solusi praktis untuk masalah ini adalah membuat Random Number Generator secara komputasi yang biasa disebut sebagai Pseudo Random number Generator.
Optimasi dari fungsi non-smooth (non differentiable),penyelesaian numerik biasanya dilakukan dengan metode monte carlo (simulated anealing, genetic algorithm).
Simulasi system dengan resiko tinggi Contoh: Simulasi pada Reaktor Nuklir.
Beberapa ahli komputasi mendefinisikan PSEUDORANDOM Sebagai angka-angka yang di-generate secara algoritmik yang “nampak” independent dan uniform.
Definisi yang lebih resmi dari pseudorandom adalah barisan angka yang di generate menurut aturan tertentu yang cukup meyakinkan sehingga tidak terdapat tes statistik yang mampu mendeteksi adanya departure (asal) dari kerandomannya.
Keuntungan dari aturan ini kita mampu memproduksi ulang bilangan-bilangan tersebut untuk tujuan computational cek/reproduction pada komputer lain.
Dalam pembahasan bilangan acak pseudorandom selanjutnya, maka diasumsikan bilangan yg di hasilkan ($\xi_i$) mempunyai distribusi Standardized rectangular distribution (Uniform):
$$ F(y)= \left\{
\begin{array}{lll}
0, \ \ \ y < 0 \\
y, \ \ \ 0 \leq y \leq 1 \\
1, \ \ \ y \geq 1 \\
\end{array}
\right. $$
Teknik dasar pembangkitan bilangan acak pseudorandom dilakukan dengan menghitung $\xi_i$ dari barisan bilangan integer positive $x_i$.
Teknik awal yang digunakan untuk membangkitkan bilangan pseudorandom adalah metode midsquare (Metropolis, Von Neumann). Teknik ini menggunakan nilai tengah dari $X_i^2$ sebagai nilai untuk suku berikutnya $(X_{i+1})$.
Tidak lama berselang (Hull dan Dobell) menemukan bahwa metode midsquare tidak memuaskan, yang kemudian diperbaiki dengan metode Congruential (Lehmer 1951).
Namun sebelum metode-metode pembangkitan pseudorandom dibahas, perlu diingat bahwa metode-metode ini sebenarnya “lack of theoritical support”, namun tidak ada practitioner yang keberatan dalam menggunakannya selama data yang dihasilkan memenuhi beberapa syarat statistik tertentu.
Sebuah barisan bilangan pseudorandom dapat dibangkitkan melalui sebuah relasi rekursif:
$$ x_i = (ax_{i-1}) \% m $$
Yaitu suku berikutnya dari sebuah barisan bilangan pseudorandom adalah sisa dari pembagian suku sebelumnya dengan $m$.
Formulasi ini mempunyai beberapa kelemahan, beberapa diantaranya adalah:
Barisan bilangannya berulang dengan periode yang selalu $< m$
Beberapa bilangan mempunyai probabilitas untuk muncul lebih besar
Formula pseudorandom yang terakhir di generalisasi lebih lanjut oleh Greenberger (1961) dengan:
$$ x_i = (ax_{i-1}+c) \% m$$
Dimana $m$ adalah bilangan yang cukup besar yang ditentukan oleh komputer yang digunakan (biasanya bilangan kelipatan 2 atau 10) dan $a$, $c$, dan $x_i$ adalah bilangan bulat non negative antara 0 dan $m-1$.
Kedua formulasi terakhir ini disebut metode Congruential, lebih khusus lagi formula Greenberger disebut Multiplicative congruential.
# Sengaja dibuat looping (bukan vectorized) untuk memudahkan dalam mengerti prosesnya.# Silahkan latihan dengan merubahnya dalam bentuk vectorized.defuniform(mu=16807,mod_=(2**31)-1,seed=11,size=1):U=np.zeros(size)x=(seed*mu+1)%mod_U[0]=x/mod_foriinrange(1,size):x=(x*mu+1)%mod_U[i]=x/mod_returnUuniform(size=20)
# seed the pseudorandom number generatorfromrandomimportseedfromrandomimportrandomseed(1)# seed random number generatorprint(random(),random(),random())# generate some random numbersseed(7)print(random(),random(),random())seed(7)print(random(),random(),random())
# Random Integer?fromrandomimportrandint# generate some integersfor_inrange(10):value=randint(0,10)print(value,end=', ')
1, 8, 1, 5, 9, 0, 8, 3, 0, 1,
In [10]:
# Memilih secara acak dari listfromrandomimportchoiceseed(1)List_=[1,6,3,88,45,67,21,90,93]print(List_)# make choices from the sequencefor_inrange(5):selection=choice(List_)print(selection,end=', ')
# seed the pseudorandom number generatorfromnumpy.randomimportseedfromnumpy.randomimportrandseed(1)print(rand(3))seed(7)print(rand(3))seed(7)print(rand(3))
Biasanya suatu simulasi kurang representative karena data aslinya non stationer (bergantung waktu atau urutan) dan autocorrelate (tidak saling bebas antar observasi), maka variabel random di generate tidak hanya random uniform tapi variable tersebut haruslah memiliki distribusi tertentu.
Metode Monte Carlo adalah sebuah teknik yang menggunakan random numbers dan probabilitas untuk menyelesaikan suatu masalah.
Kata Monte Carlo pertama kali di pelopori oleh S. Ulam dan Nicholas Metropolis berdasarkan permainan poker yang terkenal di Monte Carlo, Monaco (Hoffman, 1998; Metropolis and Ulam, 1949).
Metode Monte Carlo biasanya baik untuk digunakan ketika sebuah probabilitas kemunculan suatu proses jelas sifatnya namun hasil outputnya sulit untuk ditentukan (Poisson, Binomial, Normal, dll). Monte Carlo biasa digunakan pada masalah yang secara analitis sulit atau tidak dapat untuk diselesaikan.
Secara umum model Matematika dibagi menjadi dua macam, yaitu deterministik dan stochastic.
Simulasi Komputer menggunakan model komputasi untuk meniru (imitate) masalah pada aplikasi dunia nyata atau membuat prediksi. Ketika kita membuat model diperlukan beberapa parameter input untuk modelnya dan beberapa persamaan yang menggunakan input-input tersebut untuk menghasilkan himpunan output (response Variables). Model seperti ini biasanya disebut deterministik, yaitu kita pasti akan mendapatkan hasil yang sama betapapun kita mengulang perhitungannya. Input tertentu menghasilkan output yang tertentu pula.
Adalah sebuah metode yang secara iteratif menghitung model deterministik menggunakan bilangan random sebagai inputnya. Metode ini biasanya digunakan ketika modelnya komplex, nonlinear, atau menyangkut beberapa parameter yang tidak pasti (uncertain). Sebuah simulasi monte carlo biasanya dilakukan lebih dari setidaknya ribuan kali dalam menghitung modelnya, sehingga hardware dan teknik pemrogramannya haruslah mendukung hal tersebut.
Dengan menggunakan input yang random, sebenarnya kita telah merubah model dari deterministik ke stochastic.
Metode Monte Carlo adalah salah satu metode yang menganalisa suatu perkembangan dari ketidakpastian (uncertainty propagation), dimana tujuan utamanya adalah menentukan seberapa random variasinya (random variation), kurangnya pengetahuan (lack of knowledge), atau error yang mempengaruhi sensitivitas, performa, atau reliabilitas dari sistem yang dimodelkan.
Metode Monte Carlo dikategorikan sebagai metode Sampling karena inputnya di generate secara random dari suatu distribusi kepekatan tertentu (PDF) untuk mensimulasikan suatu teknik sampling dari populasi yang sesungguhnya. Sehingga kita berusaha untuk memilih distribusi inputnya yang sedekat mungkin dengan data yang telah dimiliki atau paling tidak yang paling representatif dari pengetahuan kita saat ini.
Data yang dihasilkan dari simulasinya dapat ditampilkan sebagai distribusi probabilitas (atau Histogram), atau di konversi ke bar error, reliabilitas prediksi, zone toleransi, dan Interval konfidensi.
Misal terdapat sebuah bujur sangkar dengan panjang sisinya 1. Di dalam bujur sangkar tsb terdapat ¼ lingkaran dengan jari-jari 1, sehingga luasnya adalah pi/4. Dengan demikian sebuah titik (x,y) didalam bujur sangkar tetapi diluar lingkaran akan memenuhi pertidaksamaan x2+y2>1.
Dengan Monte carlo kita akan coba aproksimasi nilai pi dengan sistem di atas.
Kita akan men-generate N bilangan Random uniform [0,1] = (x,y) dan memeriksa apakah titik tersebut berada di dalam lingkaran. Ratio Jumlah titik di dalam lingkaran dan total titik yang digunakan akan mendekati ratio luas lingkaran dan bujur sangkar. Sehingga nilai pi dapat diaproksimasi dengan formula:
4*(jumlah titik dlm Ligkaran)/(Total titik.)
In [62]:
# Code sengaja tidak dibuat efisien (vectorized) agar lebih mudah dipahamiNrand=10*6NInside=0seed(1)foriinrange(Nrand):ifrand()**2+rand()**2<=1.0:NInside+=1piapprox=4*NInside/Nrandprint("pi asli = {}, pendekatan MC={}, error={}".format(np.pi,piapprox,abs(piapprox-np.pi)))
pi asli = 3.141592653589793, pendekatan MC=3.066666666666667, error=0.07492598692312624
# Jawaban Latihan 1, integral dari 0 ke 1 dari f(x) thd x dengan f(x)=[exp(x)-1]/[exp(1) - 1]deff(x):return(np.exp(x)-1)/(np.exp(1)-1)seed(1)N=50teta=0.418sigma=0.286#Solusi Eksak teta dan sigmaxrand=rand(N)yrand=rand(N)# Random Uniform x dan yprint('$$$ Hit or Miss Monte Carlo $$$')# Hit or Miss Monte Carlofxrand=f(xrand)CheckValue=fxrand>=yrandHit_or_Miss=sum(CheckValue)/Nprint('Hasil Approksimasi = ',Hit_or_Miss)print('Error = ',abs(teta-Hit_or_Miss))print('Standar Error = ',np.sqrt(teta*(1-teta)/N))print('Aproksimasi Error = ',np.sqrt(Hit_or_Miss*(1-Hit_or_Miss)/N))print('Confidence Interval 95% = ',Hit_or_Miss,' +/- ',2*np.sqrt(Hit_or_Miss*(1-Hit_or_Miss)/N))
$$$ Hit or Miss Monte Carlo $$$
Hasil Approksimasi = 0.42
Error = 0.0020000000000000018
Standar Error = 0.06975327949279518
Aproksimasi Error = 0.06979971346646059
Confidence Interval 95% = 0.42 +/- 0.13959942693292118
No comments:
Post a Comment
Relevant & Respectful Comments Only.