Misalkan Anda diberi koin yang adil dan Anda ingin mensimulasikan distribusi probabilitas berulang kali membalik mati (enam sisi) yang adil. Ide awal saya adalah bahwa kita perlu memilih bilangan bulat yang sesuai , sehingga . Jadi setelah membalik koin kali, kami memetakan angka yang dikodekan oleh bitstring k-panjang untuk output dari die dengan membagi kisaran menjadi 6 interval masing-masing panjang . Namun, ini tidak mungkin, karena memiliki dua sebagai satu-satunya faktor prima tetapi faktor utama mencakup tiga. Seharusnya ada cara sederhana lain untuk melakukan ini, bukan?2 k = 6 m k [ 0 , 2 k - 1 ] m 2 k 6 m
probability-theory
randomness
sampling
probability_guy
sumber
sumber
Jawaban:
Untuk memiliki metode yang sedikit lebih efisien daripada yang ditunjukkan oleh @FrankW tetapi menggunakan ide yang sama, Anda dapat membalik koin Anda kali untuk mendapatkan angka di bawah 2 n . Kemudian tafsirkan ini sebagai batch m flips, di mana m adalah angka terbesar sehingga 6 m < 2 n (seperti yang sudah dikatakan, kesetaraan tidak pernah berlaku di sini). Jika Anda mendapatkan angka yang lebih besar atau sama dengan 6 m Anda harus menolak nilainya dan ulangi semua n flips.n 2n m m 6m<2n 6m n
Anda dapat mengimplementasikan fungsi yang mengembalikan satu kali lipat flip dengan membuat koin membalik dan kemudian men-cache hasilnya untuk permintaan flip-flip m - 1 berikut .n m−1
Poin yang menarik adalah bahwa beberapa nilai lebih baik daripada yang lain karena mereka memiliki tingkat penolakan yang kurang. Berikut adalah daftar nilai yang baik (yaitu nilai yang memiliki tingkat penolakan lebih rendah dari yang sebelumnya):n
diperoleh dengan rumus: .
Baris pertama sesuai dengan jawaban @ FrankW dengan tingkat penolakan 25%. Angka-angka berikut ini bagus: dan n = 13 keduanya dapat disimpan dalam variabel statis integer tunggal. Secara khusus tingkat penolakan n = 13 hanya 5% yang merupakan peningkatan yang masuk akal sehubungan dengan 25% dan menjadikan ini kandidat yang baik untuk implementasi yang mungkin.n=8 n=13 n=13
sumber
Yang dapat Anda lakukan, adalah menggunakan metode yang disebut sampling penolakan :
Sejak dari kemungkinan hasil mengarah ke penghentian di setiap set, probabilitas membutuhkan lebih dari1set membalik untuk mendapatkan die roll adalah(1-668 l . Karenanya, metode ini efisien dalam praktiknya.(1−68)l=14l
Perbaikan:
Jawaban @ Angel menunjukkan, bahwa jumlah koin membalik di setiap set tetapi yang pertama dapat dikurangi dari 3 menjadi 2, dengan menggunakan perbedaan antara dan 7 sebagai bit pertama untuk set berikutnya.0 7
@Emanuele Paolini menjelaskan, bagaimana Anda dapat mengurangi jumlah rerolls, jika Anda memerlukan beberapa gulungan gulungan.
sumber
Alternatif untuk sampel penolakan (seperti dijelaskan dalam jawaban FrankW ) adalah dengan menggunakan algoritma penskalaan, yang memperhitungkan jawaban [7,8] seolah-olah itu adalah koin lain yang membalik.
Ada penjelasan yang sangat rinci di mathforum.org , termasuk algoritma (itu
NextBit()
akan membalik koin Anda yang adil).Kasus untuk melempar dadu dengan koin yang adil (pengambilan sampel 2 → 6) lebih mudah daripada algoritma umum. Anda hanya mengambil kegagalan (7 atau 8) sebagai input koin lain dan melakukan dua flips lagi.
sumber
Pendekatan lain untuk mensimulasikan gulungan dN menggunakan dM (dalam kasus pertanyaan spesifik yang diajukan d6 menggunakan d2) adalah mempartisi interval [0, 1) menjadi N dengan interval yang sama dengan panjang 1 / N, [0, 1 / N), [1 / N, 2 / N), ..., [(N-1) / N, N).
Gunakan dM untuk menghasilkan fraksi basis-M, 0.bbbb ..., dalam [0, 1). Jika itu termasuk dalam [(i-1) / N, i / N), anggap saya sebagai gulungan dN. Perhatikan bahwa Anda hanya perlu menghasilkan digit basis-M yang cukup dari fraksi untuk menentukan intervalnya.
sumber
Penjelasan yang mungkin lebih sederhana tentang pengambilan sampel penolakan yang ditingkatkan.
Saya memberikan penjelasan ini karena semoga dapat membantu menyederhanakan pemahaman atau analisis probabilitas dalam beberapa situasi.
FrankW menyarankan menggunakan sampel penolakan, membalik koin tiga kali, menjaga hasilnya jika berada di kisaran yang tepat, atau mengulangi tiga membalik sebaliknya, hingga sukses.
Ángel menyarankan untuk menyimpan satu flip pada setiap percobaan, menggantinya dengan pilihan biner yang tersisa dari dua nilai yang tidak digunakan dari set sebelumnya tiga.
Ini benar-benar berarti bahwa satu bit informasi dihasilkan dengan tiga membalik pertama, yang tidak perlu diproduksi. Lebih tepatnya, Anda harus membalik koin hanya dua kali untuk mengetahui apakah set flips saat ini akan berhasil.
Mengetahui apakah set flip saat ini akan berhasil adalah satu-satunya probabilitas yang penting , karena menafsirkan set flip yang sukses adalah probabilitas independen. Dan ini bisa diketahui sebelum semua flips diselesaikan untuk set itu.
Ini dapat dicapai setidaknya dalam dua cara, atau lebih tepatnya dalam dua interpretasi yang berbeda dari flip. Mungkin ada yang lain.
Pengelompokan menghasilkan berpasangan
Idenya adalah untuk mempertimbangkan hanya tiga nilai (1,2), (3,4) dan (5,6) yang diwakili oleh tiga konfigurasi double-flip, katakanlah TT, TH, HT. Kemudian, Anda dapat menerapkan sampel penolakan dengan membalik ganda, berulang setiap kali Anda mendapatkan konfigurasi kegagalan HH.
Setelah Anda mendapatkan salah satu dari tiga konfigurasi yang berhasil, Anda cukup membalik koin sekali lagi untuk memutuskan apakah Anda harus mengambil nilai pertama atau kedua dari pasangan yang sesuai.
Deteksi dini kegagalan flip-set
Idenya adalah menggunakan pembacaan yang sedikit berbeda dari konfigurasi tiga flip. Jika Head dan Tail ditafsirkan sebagai 1 dan 0, maka konfigurasi harus sesuai dengan interpretasi biner ditambah satu. Yaitu TTT (yaitu 000) sesuai dengan 1, HTH (yaitu 101) sesuai dengan 6, HHT (yaitu 110) dan HHH (yaitu 111) sesuai dengan 7 dan 8, atau apa pun di luar [1,6].
Kemudian kita tahu bahwa flip-set berhasil atau gagal hanya dengan dua flip pertama. Jika mereka menghasilkan HH, set flip gagal terlepas dari flip terakhir. Jadi bisa dilewati.
Saya pikir deteksi dini selalu dapat digunakan sebagai penjelasan, tetapi tergantung pada jumlah wajah pada dadu simulasi Anda, deteksi kegagalan dapat terjadi setelah sejumlah variabel membalik.
Misalnya untuk dadu 10 wajah, pada prinsipnya Anda perlu set flip 4 membalik, dengan 6 konfigurasi yang sesuai dengan kegagalan. Kuncinya adalah memiliki semua konfigurasi kegagalan di urutan teratas dari nilai-nilai biner sebagai berikut:
Konfigurasi yang berhasil sesuai dengan rentang [1, 10] dan kegagalan untuk rentang [11,16].
Maka Anda gagal ketika dua membalik pertama memberi HH, atau ketika tiga membalik pertama memberikan HTH, tanpa harus bahkan mencoba membalik hilang dari set.
Jika Anda tidak gagal, Anda cukup menghentikan set flips.
sumber
Ada dua pendekatan terkenal untuk ini. Salah satunya adalah "sampel penolakan". Misalnya, gunakan tiga bit untuk memilih satu dari enam nilai, coba lagi untuk dua sampel tambahan. Atau gunakan 14 bit (nilai 8192) untuk memilih 5 nilai dari 1 hingga 6 (7776 kemungkinan), coba lagi dalam 13 dari 256 kasus.
Yang lainnya adalah menggunakan bagian dekompresi dari algoritma kompresi / dekompresi: Dengan pengkodean aritmatika, suatu urutan nilai acak dari 1 hingga 6 dapat dikompres dengan hampir tanpa redundansi. Buat urutan terkompresi secara acak, dan dekompreslah. Ini jauh lebih rumit, tetapi praktis tidak akan memerlukan nomor acak tambahan.
sumber
Maaf sebelumnya jika penjelasannya berlebihan. Saya tidak yakin berapa banyak detail untuk masuk atau seberapa mudah konsep itu dipahami.
Katakanlah Anda memiliki tiga koin (koin adil). Jika Anda secara bertahap memberikan nilai ke setiap sisi dari setiap koin, Anda akan memiliki enam nilai.
Seperti itu: Pada koin pertama, kepala adalah 1 dan ekor adalah 2. Pada koin kedua, kepala adalah 3 dan ekor adalah 4. Pada koin ketiga, kepala adalah 5 dan ekor adalah 6.
Membalik koin akan meninggalkan Anda dengan satu set tiga angka, set Anda saat ini. Sekarang, set Anda saat ini akan menjadi set sebelumnya dan Anda akan mengulangi proses untuk mendapatkan set baru tiga angka.
Terus lakukan ini hingga satu dan hanya satu angka yang cocok dari set Anda saat ini dengan set sebelumnya. Itu nomormu.
Jadi jika Anda mendapatkan [kepala, ekor, kepala] untuk set saat ini, itu akan menjadi [1, 4, 5]. Sekarang Anda balikkan lagi dan set Anda saat ini adalah [2, 4, 5]. Dua pertandingan. Tidak baik. Coba lagi. Anda mendapatkan [2, 3, 6]. Hanya satu yang cocok. Nomor Anda dua.
Akan ada peluang yang sama bahwa setiap angka yang diberikan akan muncul, tetapi itu tidak terlalu hemat biaya, mengingat bahwa hanya ada perubahan 3/32 bahwa setiap pasangan perangkat akan berhasil (hanya satu pertandingan). Jadi rata-rata, algoritma harus mengulang sekitar sepuluh kali. Juga, tidak mudah digeneralisasikan untuk mati bernomor ganjil.
Paling tidak, mungkin itu makanan untuk dipikirkan. Pertanyaan yang sangat menarik.
sumber
Saya akan membalik koin tiga kali dan menafsirkan hasilnya sebagai angka biner, menolak hasil di luar jangkauan.
Misalnya, biarkan kepala menjadi 1 dan ekor menjadi 0. Jika Anda membaliknya tiga kali dan mendapat kepala, ekor, kepala, Anda akan memiliki biner 101, yaitu 5 dalam desimal. HHT = 110b = 6. TTT = 000b = 0 dan HHH = 111b = 7, keduanya di luar jangkauan dan akan ditolak, dan Anda akan merefleksikan semua digit.
sumber
Sayangnya seseorang tidak dapat (dengan setia) mensimulasikan kematian (adil) menggunakan (urutan) koin yang adil.
Hanya karena ruang acara dadu memiliki dimensi6 dan ini tidak bisa persis cocok dengan kekuatan 2 (Itulah yang disediakan oleh ruang acara dari koin yang adil).
Tetapi orang dapat melakukan ini dengan "koin tiga" yang adil (jika istilah seperti itu dapat digunakan). Berarti koin dengan 3 hasil. Dan koin 2 sederhana, jadi ruang gabungan dari 2 koin ini cocok persis dengan ruang acara die.
Sampling penolakan (seperti yang disebutkan dalam beberapa jawaban) dapat memberikan perkiraan simulasi . Tetapi masih akan memiliki sejumlah kesalahan atau salah-kecocokan probabilitas (dalam waktu yang terbatas). Jadi, jika seseorang ingin benar-benar mencocokkan ruang acara dari 2 sistem ini, akan ada kasus yang tidak akan berfungsi.
Dalam simulasi probabilistik (yang sampel penolakannya merupakan contoh), sekuens khas yang dihasilkan memang menunjukkan probabilitas elementer relatif (dalam hal ini ruang kejadian die). Namun (seperti yang disebutkan dalam komentar) masing-masing urutan khas ini dapat berisi sub-urutan panjang sewenang-wenang dari hasil yang persis sama. Ini berarti bahwa untuk menggunakan sampel penolakan (dalam beberapa kasus) dapat memakan waktu lama atau distribusi yang dihasilkan akan bias (yaitu tidak adil), karena terlalu banyak representasi atau kurang terwakili dari beberapa bagian ruang acara . jika ini tidak terjadi, maka algoritma deterministik akan mungkin yang akan persis cocok dengan ruang acara dadu dan koin (yang tidak cocok dengan dimensi).
sumber