Так і ні, залежно від того, що ви маєте на увазі під "єдиним способом". Так, оскільки не існує методу, який гарантовано припинить, найкраще, що ви можете зробити (для загальних значень і ) - це алгоритм, який закінчується з вірогідністю 1. Ні. Це означає, що ви можете зробити "відходи" як малі як тобі до вподоби.RNR
Чому гарантоване припинення взагалі неможливо
Припустимо, у вас є детермінований двигун обчислень (машина Тюрінга або що-небудь плаває на вашому човні), плюс оракул, який генерує випадкові елементи набору елементів . Ваша мета полягає в тому, щоб сформувати елемент - елементного безлічі . Вихід вашого двигуна залежить лише від послідовності значень, повернутих оракулом; це функція цієї потенційно нескінченної послідовності .[ 0 .. R - 1 ] N [ 0 , N - 1 ] f ( r 0 , r 1 , r 2 , … )R[0..R−1]N[0,N−1]f(r0,r1,r2,…)
Припустимо, ваш двигун дзвонить у оракул щонайбільше разів. Можуть бути сліди, за якими оракул називається менше разів; якщо так, виклик Oracle додаткові рази, щоб він завжди називався саме разів, не змінює вихід. Отже, не втрачаючи загальності, ми припускаємо, що оракул називається рівно разів. Тоді ймовірність результату - це кількість послідовностей така, що . Оскільки оракул є рівномірним випадковим генератором, кожна послідовність є однозначною і має ймовірність . Отже, ймовірність кожного результату має формуm m m x ( r 0 , … , r m - 1 ) f ( r 0 , … , r m - 1 ) = x 1 / R m A / R m A 0 R mmmmmx(r0,…,rm−1)f(r0,…,rm−1)=x1/RmA/Rmде - ціле число між і .A0Rm
Якщо ділить на деякий , то ви можете створити рівномірний розподіл по елементах, викликаючи випадковий генератор разів (це залишено читачем як вправу). В іншому випадку, це неможливо: немає ніякого способу , щоб отримати результат з імовірністю . Зауважте, що умова еквівалентна тому, що всі основні фактори також є факторами (це більш дозволено, ніж те, що ви написали у своєму запитанні; наприклад, ви можете вибрати випадковий елемент серед 4 із 6-сторонній ярмарком вмирають, хоча 4 не ділить 6).R m m N m 1 / N N RNRmmNm1/NNR
Зменшення відходів
У своїй стратегії, коли , вам не доведеться відразу малювати. Інтуїтивно, в залишилось трохи ентропії, яку ви можете зберегти в суміші.[ кr≥kN[kN..R−1]
Припустимо на хвилину , що ви насправді тримати генерації випадкових чисел нижче назавжди, і ви генерувати з них в той час, роблячи розіграшів. Якщо ви робите прямий відбір проб відхилення для цього згрупованого покоління, відходи над притягує , тобто залишок ділиться на кількість нічиїх. Це може бути не менше . Коли і є спільними, ви можете зробити відходи довільно невеликими, вибравши досить великі значення . Для загальних значень іу д д Р д - кNuddRd−kNudRdmodNugcd(R,N)RNdRN, розрахунок складніший, оскільки потрібно враховувати генерацію та , але знову ж таки ви можете зробити відходи довільно невеликими з досить великими групами.gcd(R,N)N/gcd(R,N)
На практиці, навіть при відносно неефективних випадкових числах (наприклад, у криптографії), рідко варто робити що-небудь, крім простого відбору відхилення, якщо тільки невеликий. Наприклад, у криптографії, де зазвичай є потужністю 2, а зазвичай становить сотні чи тисячі біт, рівномірне генерування випадкових чисел зазвичай відбувається шляхом прямої вибірки відхилення в потрібному діапазоні.NRN