Apakah penolakan sampel adalah satu-satunya cara untuk mendapatkan distribusi angka acak yang benar-benar seragam?

21

Misalkan kita memiliki generator acak yang mengeluarkan angka dalam kisaran [0..R1] dengan distribusi seragam dan kita perlu menghasilkan angka acak dalam kisaran [0..N1] dengan distribusi seragam.

Misalkan N<R dan N tidak membagi secara merata R; untuk mendapatkan distribusi yang benar - benar seragam, kita dapat menggunakan metode sampel penolakan :

  • jika k adalah yang terbesar bilangan bulat sehingga kN<R
  • pilih angka acak r dalam [0..R1]
  • jika r<kN maka keluaran , jika tidak teruslah mencoba dengan angka acak lainnya r ', r ", ... sampai kondisinya terpenuhirmodN
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 +N>Rr[0..Rm1],Rm>=Nr=R(...R(Rr1+r2)...)+rmri[0..R1]

Vor
sumber

Jawaban:

13

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.RNR

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..R1]N[0,N1]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 mmmmmx(r0,,rm1)f(r0,,rm1)=x1/Rm di mana A adalah bilangan bulat antara 0 dan R m .A/RmA0Rm

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).NRmmNm1/NNR

Mengurangi limbah

Dalam strategi Anda, ketika , Anda tidak harus segera menggambar ulang. Secara intuitif, ada sedikit entropi yang tersisa di [ krkN yang dapat disimpan dalam campuran.[kN..R1]

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 - kNuddRdkNudRdmodNugcd(R,N)RNdRNgcd(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.NRN

Gilles 'SANGAT berhenti menjadi jahat'
sumber
Bukti pertama cacat: keberadaan terlalu kuat. Kita dapat memiliki mesin yang mengkonsumsi banyak elemen secara sewenang-wenang, tetapi selalu berakhir. Pada dasarnya, kami ingin mengecualikan satu urutan (yang tidak pernah berakhir) tetapi Anda mengecualikan semua tapi banyak sekali. m
Raphael
@ Raphael Saya tidak yakin saya mengerti maksud Anda. Bisakah Anda memberi contoh mesin seperti itu?
Gilles 'SO- berhenti bersikap jahat'
Ah, kekhawatiran saya terlalu umum. Di sini - mengingat tidak adanya input - Anda benar. Jika semua perhitungan berakhir, ada banyak (tidak ada input, jumlah keputusan terbatas per langkah, hingga pohon terbatas), oleh karena itu ada yang terpanjang yang memberi Anda . m
Raphael
@Raphael Komentar Anda membuat saya berpikir tentang presentasi yang lebih baik untuk pemirsa TCS: jadikan RNG input dari sebuah TM daripada sebuah oracle. Kami berasumsi bahwa TM berakhir (jika tidak algoritma tidak benar). Jika ada sehingga apapun input, terlihat TM di paling m sel input, kemudian <bla bla dibagi oleh R m bla bisa tidak memiliki N equiprobable hasil>. Kalau tidak, untuk semua m , probabilitas membutuhkan setidaknya m draw adalah setidaknya R - m . mmRmNmmRm
Gilles 'SO- stop being evil'
1
@ Raphael: Lemma König menunjukkan bahwa jika mesin selalu berakhir, maka sebenarnya ada batas atas pada waktu berjalannya. Ini berfungsi selama set output dari RNG terbatas (dan jika tidak, itu sepele).
Yuval Filmus
6

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,,R1][0,,N1]mm(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).

Yuval Filmus
sumber
5

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.NN

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 .

Jérémie
sumber