Makasih pak summonery.... sy sebenarnya udah coba nyari... tapi kurang gigih aja nyarinya jadi fungsi
x1 = ( x0 * a + c ) MOD (2^24) td ga ketemu-temu. Itulah kelebihannya ilmu.. jika di bagi ke orang lain, jumlahnya tidak akan berkurang, malah semakin bertambah. Dari proses membaginya itu sendiri saja, saya yakin, kalau ilmunya itu sudah bertambah dengan sendirinya, apalagi setelah ilmunya tsb dibagi dan mendapatkan feed back sprt barusan ini, semakin bertamabah... Sekali lagi makasih ya.... teruslah berbagi.... ________________________________ From: summonery <[email protected]> To: [email protected] Sent: Monday, April 11, 2011 8:58 AM Subject: Re: [belajar-excel] Re: Random Patern senangnya ada member be excel yg sprti pak hilman ini :) ikut menambahkan yg saya tahu, sekuensial random biasanya digunakan dalam ilmu statistik, non sekuensial lebih banyak digunakan pada software game (cmiiw) Dan Algoritma (formula) yang digunakan dalam fungsi RND: ======================================= Microsoft Visual Basic uses the linear-congruential method for pseudo-random number generation in the RND function. The following pseudo code documents the algorithm used: x1 = ( x0 * a + c ) MOD (2^24) x1 = new value x0 = previous value (an initial value of 327680 is used by Visual Basic) a = 1140671485 c = 12820163 ======================================= bahan bacaan: INFO: How Visual Basic Generates Pseudo-Random Numbers for the RND Function http://support.microsoft.com/kb/231847 RND and RANDOMIZE Alternatives for Generating Random Numbers http://support.microsoft.com/kb/28150/EN-US Pseudorandom number generator http://en.wikipedia.org/wiki/Pseudorandom_number_generator Linear congruential generator http://en.wikipedia.org/wiki/Linear_congruential_generator >semoga bermanfaat --- In [email protected], "STDEV(i)" <setiyowati.devi@...> wrote: > > Asik nih, kita ketambahan members yg suka sebar2 pengalaman & berbagi > pengetahuan seperti ini... > > Terma kasih mas Hilman, atas info di balik info soal acak-mengacak. > Ini tentu saja menambah wawasan kami members milis [belajar-excel]. > > Tidak banyak orang yg memperhatikan detil acakan seperti itu kecuali orang > yg > pernah ketemu atau terlibat langsung (aplikasi yg dibuatnya memerlukan data > yg diacak-acak secara 'bagus' > > Beberapa waktu yang lalu siti juga dengar ada yang bilang (entah siapa dan > kapan) > bahwa untk membuat "acakan yg agak lebih acak" kita disarankan mmberikan > statement > > Randomize > > Katanya, dengan adanya statement ini, VBA akan memberi BENIH BARU untuk > proses > pengacakan berikutnya; mungkin prinsipnya sama atau mirip-mirip dengan > > If Rnd = 0.705547511577606 Then Call AcakFungsiRndUtkPertamakali > Mungkin lho ya... (cmiiw..) > Siapa tahu hal ini akan dibahas mas Hilman di tulisan berikutnya..., > > Terima kasih & > wassalam > -siti- > > > http://groups.yahoo.com/group/XL-mania/files/Lessons/macro%20-%20random.zip > http://groups.yahoo.com/group/XL-mania/files/Lessons/function%20-%20random_with_normal_distribution.zip > http://tech.groups.yahoo.com/group/XL-mania/message/17930 > http://tech.groups.yahoo.com/group/XL-mania/message/17907 > > > > > > 2011/4/10 Hilman <hilman_email@...> > > > > > Tau ngga,…?? Kalau Random Number yg dihasilkan dari fungsi Rnd pada VBA, > > menghasilkan pola yang sama. > > atau dengan kata lain, hasil dari proses pengacakan nya sudah dapat di > > prediksi…. > > > > Pada saat workbook "Random Patern.xls" ini baru dibuka, perhatikan cell > > A1. Nilainya adalah "Acak ke 0" > > Ketika tombol ACAK di klik, A1 nilainya menjadi "Acak Ke 1", perhatikan > > nilai A2:A1001 nilainya sama dengan B2:B1001 > > Demikian pula ketika tombol ACAK di klik lagi (A1 = "Acak ke 2"), nilai > > A2:A1001 sama dengan nilai C2:C1001 > > Demikian pula ketika tombol ACAK di klik lagi (A1 = "Acak ke 3"), nilai > > A2:A1001 sama dengan nilai D2:D1001 > > > > Tombol "ACAK" diberi tugas untuk menjalankan procedure "AcakNomor" > > Procedure "AcakNomor" bertugas untuk membangkitkan nomor acak dari > > angka 1 sampai 1000 > > dan Nomor acak tsb akan diisi ke cell A2:A1001. > > Kolom A adalah Random Number yg di generate dari fungsi random VBA, > > procedure "AcakNomor" > > Kolom B, C, D adalah angka yg akan dihasilkan dari proses pengacakan ke > > 1, ke 2 dan ke 3. > > > > Sub AcakNomor() > > > > Dim acak As Integer > > Dim i As Integer > > > > Application.ScreenUpdating = False > > Application.Calculation = xlCalculationManual > > For i = 1 To 1000 > > 'membangkitkan angka acak dari 1 sampai 1000 > > acak = Int((1000) * Rnd + 1) > > Sheet1.Cells(i + 1, 1) = acak > > Next i > > > > UrutanAcak = UrutanAcak + 1 > > Sheet1.[a1] = "Acak Ke " & UrutanAcak > > > > Application.ScreenUpdating = True > > Application.Calculation = xlCalculationAutomatic > > End Sub > > > > Lho…. Kok bisa ya…. Masa bilangan acak angkanya bisa ditebak…. Bukan > > bilangan acak dong namanya. > > eh…. Jangan protes dulu dong. Sebetulnya Random Number (bil. Acak) itu > > dihasilkan dengan menggunakan formula > > tertentu, dimana bil acak itu adalah fungsi dari bil. Acak sebelumnya. > > Jadi jika diketahui bil. Acak yg pertama, > > maka bil. acak yg kedua dan seterusnya pasti bisa diketahui nilainya, > > jika algoritma (formula) yg digunakan > > juga diketahui. Terus…. Algoritma apa dong yg dipakai oleh excel untuk > > menghasilkan bil. Acak?? > > Waduh…. Kalo itu sih saya ga tau….!! Ada yg tau ga?? > > > > Tapi kita tidak perlu tau algoritma-nya, yg jelas kita bisa mengetahui > > bil. Acak yg dihasilkan oleh VBA dari yg pertama > > sampai dengan yg ke 3000 misalnya, atau bahkan sampai dengan yg > > ke-1000000 dengan cara mengisi hasil dari > > fungsi Rnd() ke cell-cell dalam worksheet, melalui presedur sederhana > > berikut ini. > > > > Sub IsiBilAcakKeWorksheet() > > > > Dim i As Integer > > Dim j As Integer > > > > Application.ScreenUpdating = False > > Application.Calculation = xlCalculationManual > > > > For j = 2 To 4 > > For i = 1 To 1000 > > Sheet2.Cells(i + 1, j) = Rnd > > Next i > > Next j > > > > Application.ScreenUpdating = True > > Application.Calculation = xlCalculationAutomatic > > End Sub > > > > Perhatikan nilai B2:D1001 pada sheet2. Nilai tsb adalah bilangan acak yg > > dihasilkan oleh fungsi Rnd dari yg pertama > > sampai dengan yang ke 3000. Jika nilai B2:D1001 tsb kita hapus, dan > > workbook ini di save dan di close dan di Open lagi, > > kemudian, prosedur "IsiBilAcakKeWorksheet" kita jalankan, maka nilai > > B2:D1001 akan tetap sama dengan nilai sebelum > > dihapus. > > > > Jadi, gimana dong untuk bisa menghasilkan bil. Acak yg benar-benar > > nilainya acak (tidak bisa diprediksi) atau > > minimal bilangan tsb sangat sulit untuk di prediksi ??? > > > > Fortunately… eh untungnya….. Pada VBA terdapat fungsi Timer, yg > > untungnya lagi… Timer tsb tidak presisi. > > Lho… kok tidak presisi malah jadi keuntungan??? Kok bisa?? > > Jadi begini…. Kita memanfaatkan ketidak presisian Timer tsb untuk > > me-looping Fungsi Rnd() selama 0.1 detik misalnya. > > Lho… kok Cuma 0.1 dtk?? Yah pokoknya terserah berapa aja deh… 0.3 dtk > > juga boleh atau bahkan 5 detik juga boleh. > > Tapi jangan kelamaan yaa.. Nanti kalo terlalu lama bosan nanti > > nunggunya. Tapi prinsipnya 0.1 detik itu sudah lebih > > dari cukup. Bisa ditebak ngga, selama waktu 0.1 detik tsb terjadi berapa > > kali looping fungsi Rnd()?? 1000 kali kah?? > > 10000 kali kah??. > > > > Jawaban pastinya bisa kita peroleh dengan membuat satu prosedur > > sederhana lagi, seperti di bawah ini…… > > > > Sub AcakFungsiRndUtkPertamakali() > > > > Dim tm As Double > > Dim JumlahRndLoop As Long > > Dim i As Integer > > > > Application.ScreenUpdating = False > > Application.Calculation = xlCalculationManual > > > > For i = 1 To 300 > > tm = Timer > > JumlahRndLoop = 0 > > Do > > JumlahRndLoop = JumlahRndLoop + 1 > > Rnd > > Loop Until Timer - tm > 0.1 'looping selama 0.1 detik > > Sheet2.Cells(i, 10) = JumlahRndLoop > > Next i > > > > Application.ScreenUpdating = True > > Application.Calculation = xlCalculationAutomatic > > > > End Sub > > > > Prosedur ini bertugas untuk me-looping fungsi Rnd() selama 0.1 detik > > sekaligus merekam jumlah loopingnya > > pada variable JumlahRndLoop. Selanjutnya nilai dari JumlahRndLoop tsb > > ditulis di cell J1 pada sheet2. > > Proses looping selama 0.1 detik ini, kemudian dilooping lagi selama 300 > > kali, dan setiap proses looping waktu > > selama 0.1 detik tsb, nilai JumlahRndLoop ditulis ke cell J1:J300 pada > > sheet2. > > > > Sekarang, perhatikan variasi jumlah looping Rnd() pada cell J1:J300, > > selama 0.1 dtk. Eh… Kolom nya di UnHide dulu ya…. > > Dari hasil yg sudah saya coba dengan menjalankan prosedur > > "AcakFungsiRndUtkPertamaKali" ini, dapat kita lihat > > ternyata jumlah loop nya bervariasi mulai dari yg terkecil 375278 kali > > hingga yang terbesar sebanyak 409975 kali. > > Pada kolom K dapat kita lihat, jumlah loop yg hasilnya sama (jumlah dari > > jumlah loop yg lebih besar dari 1) hanya > > 26 kali. Tentunya hasil di atas akan berbeda jika anda mencoba > > menjalankan lagi prosedur-nya. > > > > Jadi… apa hubungannya nih.. Antara Looping fungsi Rnd() selama 0.1 dtk > > ini, dengan nilai Random (bil. Acak) yg bisa > > ditebak tadi??? Jelas ada dong… jadi supaya fungsi Rnd() tadi tidak > > menghasilkan bilangan yg bisa ditebak, maka > > sebelum fungsi Rnd() ini kita pakai untuk pertama kalinya dalam program > > yang telah dibuat tadi, maka prosedur > > "AcakRndUtkPertamakali" harus dijalankan (di-call) dulu. Caranya ??? Ada > > dua alternatif, > > > > Pertama dengan memanfaatkan Event Workbook_Open > > Private Sub Workbook_Open() > > Call AcakFungsiRndUtkPertamakali > > End Sub > > > > Kedua dengan menambahkan line berikut ini pada Prosedur "AcakNomor" > > If Rnd = 0.705547511577606 Then Call AcakFungsiRndUtkPertamakali > > > > Oh iya… sebelum prosedur "AcakFungsiRndUtkPertamakali" digunakan, jangan > > lupa untu menghapus line yg tidak > > dibutuhkan, sehingga prosedurnya bisa menjadi lebih sederhana, sprt di > > bawah ini….. > > > > Sub AcakFungsiRndUtkPertamakali() > > > > Dim tm As Double > > > > tm = Timer > > Do > > Rnd > > Loop Until Timer - tm > 0.1 'looping selama 0.1 detik > > > > End Sub > > > > Nah…, sekarang workbooknya di-Save, terus di-Close dan di-Open lagi, > > setelah itu tombol "ACAK" di klik. > > Apa yg terjadi??? Yap…. Betul, sekarang bilangan Acak pada A2:A1001 > > sudah tidak sama lagi dengan nilai B2:B1001, > > ketika cell A1 nilainya adalah "Acak Ke 1". Jika tombol "ACAK" di klik > > lagi, nilai A2:A1001 tidak sama dengan C2:C1001 > > Jika tombol ACAK di klik lagi (A1= "Acak ke 3"), nilai A2:1001 tidak > > sama dengan D2:D1001. > > > > Untuk lebih meyakinkan lagi nilai dari A2:A1001 mulai dari klik pertama > > (Acak ke 1) s/d klik ketiga (Acak ke 3) di copy > > masing-masing ke B2:B1001, C2:C1001, dan D2:D1001. Kemudian workbook di > > Save, di Close dan di Open lagi. > > Lalu tombol Acak di klik lagi, perhatikan nilainya…… > > > > > > Regards > > Hilman > > > > >

