Misalkan kita memiliki generator acak yang mengeluarkan angka dalam kisaran dengan distribusi seragam dan kita perlu menghasilkan angka acak dalam kisaran dengan distribusi seragam.
Misalkan dan tidak membagi secara merata ; untuk mendapatkan distribusi yang benar - benar seragam, kita dapat menggunakan metode sampel penolakan :
- jika adalah yang terbesar bilangan bulat sehingga
- pilih angka acak dalam
- jika maka keluaran , jika tidak teruslah mencoba dengan angka acak lainnya r ', r ", ... sampai kondisinya terpenuhi
Apakah penolakan sampel adalah satu-satunya cara untuk mendapatkan distribusi diskrit yang benar-benar seragam?
Jika jawabannya ya, mengapa?
Catatan: jika idenya sama: menghasilkan angka acak dalam , misalnya mana r_i adalah nomor acak dalam rentang [0..R-1]r ' [ 0 .. R m - 1 ] , R m > = N r ' = R ( . . . R ( R r 1 +
Jawaban:
Ya dan tidak, tergantung pada apa yang Anda maksud dengan "satu-satunya cara". Ya, karena tidak ada metode yang dijamin akan berakhir, yang terbaik yang dapat Anda lakukan (untuk nilai generik dan ) adalah algoritma yang berakhir dengan probabilitas 1. Tidak, karena Anda dapat menjadikan "limbah" sekecil mungkin sesukamu.RN R
Mengapa jaminan pemutusan hubungan kerja tidak mungkin secara umum
Misalkan Anda memiliki mesin komputasi deterministik (mesin Turing atau apa pun mengapung perahu Anda), ditambah sebuah ramalan yang menghasilkan elemen acak dari -element set . Tujuan Anda adalah untuk menghasilkan elemen set elemen- . Output dari mesin Anda hanya bergantung pada urutan nilai yang dikembalikan oleh oracle; itu adalah fungsi dari bahwa urutan berpotensi terbatas .R [0..R−1] N [0,N−1] f (r0,r1,r2,…)
Misalkan mesin Anda memanggil oracle paling kali. Mungkin ada jejak yang disebut oracle kurang dari kali; jika demikian, memanggil oracle ekstra kali sehingga selalu dipanggil tepat kali tidak mengubah output. Jadi tanpa kehilangan keumuman, kita menganggap bahwa oracle itu disebut tepat kali. Maka probabilitas hasil adalah jumlah urutan sedemikian sehingga . Karena oracle adalah generator acak yang seragam, masing-masing urutan dapat dilengkapi dan memiliki probabilitas . Oleh karena itu probabilitas setiap hasil adalah dari bentuk Am m m x ( r 0 , … , r m - 1 ) f ( r 0 , … , r m - 1 ) = x 1 / R mm m m m x ( r0, ... , rm - 1) f( r0, ... , rm - 1) = x 1 / Rm di mana A adalah bilangan bulat antara 0 dan R m .A/Rm A 0 Rm
Jika membagi R m untuk beberapa m , maka Anda dapat menghasilkan distribusi seragam atas N elemen dengan memanggil acak m kali (ini dibiarkan sebagai latihan bagi pembaca). Jika tidak, ini tidak mungkin: tidak ada cara untuk mendapatkan hasil dengan probabilitas 1 / N . Perhatikan bahwa kondisinya setara dengan mengatakan bahwa semua faktor utama N juga merupakan faktor R (ini lebih permisif daripada apa yang Anda tulis dalam pertanyaan Anda; misalnya Anda dapat memilih elemen acak di antara 4 dengan adil 6 sisi. mati, meskipun 4 tidak membagi 6).N Rm m N m 1/N N R
Mengurangi limbah
Dalam strategi Anda, ketika , Anda tidak harus segera menggambar ulang. Secara intuitif, ada sedikit entropi yang tersisa di [ kr≥kN yang dapat disimpan dalam campuran.[kN..R−1]
Asumsikan sejenak bahwa Anda akan pada kenyataannya terus menghasilkan angka acak di bawah selamanya, dan Anda menghasilkan u dari mereka pada waktu dengan membuat d menarik. Jika Anda melakukan penolakan langsung pengambilan sampel pada generasi dikelompokkan ini, limbah lebih d menarik adalah R d - kN u d d Rd−kNud RdmodNu gcd(R,N) R N d R N gcd(R,N) N/gcd(R,N)
Dalam praktiknya, bahkan dengan angka acak yang relatif tidak efisien (misalnya dalam kriptografi), jarang ada yang layak dilakukan selain sampel penolakan sederhana, kecuali jika kecil. Misalnya, dalam kriptografi, di mana biasanya memiliki kekuatan 2 dan biasanya ratusan atau ribuan bit, pembangkitan bilangan acak yang seragam biasanya dihasilkan dengan sampel penolakan lurus dalam kisaran yang diinginkan.N R N
sumber
Teorema pengkodean sumber Shannon menunjukkan bahwa, dalam arti tertentu, Anda memerlukan sampel (rata-rata) dari tipe [ 0 , … , R - 1 ] untuk menghasilkan nomor acak dari tipe [ 0 , … , N - 1 ] . Lebih akurat, Shannon memberikan algoritma (tidak efisien) yang memberikan sampel m dari tipe pertama, output m ( log N / log R - ϵ )logN/logR [0,…,R−1] [0,…,N−1] m m(logN/logR−ϵ) sampel dari tipe kedua, dengan probabilitas tinggi. Dia juga menunjukkan bahwa mengeluarkan sampel dengan probabilitas tinggi adalah mustahil.m(logN/logR+ϵ)
Teorema Shannon juga bekerja dalam kasus yang lebih umum dari distribusi input miring (dan mungkin juga distribusi keluaran miring). Dalam hal ini, Anda perlu mengganti logaritma dengan entropi. Sementara algoritma yang diberikan oleh teorema didefinisikan secara acak, dalam beberapa kasus dimungkinkan untuk melakukan derandomisasi (dengan mengorbankan kinerja yang agak buruk).
sumber
Sebenarnya, tidak, sampel penolakan jauh dari satu-satunya cara untuk melanjutkan. Sayangnya, mengingat bahwa komputer menyimpan semua informasi sebagai bit, dan dengan demikian hanya dapat memanipulasi bit informasi acak, algoritma apa pun untuk menggambar variabel acak seragam dari rentang akan menjadi tak terbatas, jika pengembangan basis biner dari N tidak terbatas.N N
Teorema ini adalah hasil klasik oleh Knuth dan Yao (1976), yang mengembangkan kerangka kerja pohon-pohon DDG (pohon penghasil distribusi diskrit).
Metode yang diekspos oleh Gilles adalah hal-hal khas yang telah dilakukan untuk mengurangi limbah yang ditimbulkan oleh penolakan, tetapi tentu saja jika seseorang dapat menghasilkan mengikuti pohon Knuth dan Yao itu jauh, jauh lebih efisien - rata-rata 96% dari bit acak diselamatkan.
Saya telah memberikan informasi lebih lanjut tentang ini di posting CStheory berikut .
sumber