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..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 mmmmmx( r0, ... , rm - 1)f( r0, ... , rm - 1) = 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 [ 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 - kNuddRd−kNudRdmodNugcd(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