数値 0 (30% の確率) または 1 (70% の確率) を生成する rand1() という名前の関数がある場合、数値 0 または 1 の同等確率を生成する関数 rand2() をどのように記述して rand1() を使用しますか?
更新:</p>
最後に、これは書籍 Introduction to Algorithms (2nd) (この書籍の中国語版を購入しました) Excercise 5.1-3 の問題であることがわかりました。元の問題は次のとおりです。
5.1-3 1/2 の確率で 0 を、1/2 の確率で 1 を出力したいとします。自由に使えるのは、0 または 1 のいずれかを出力するプロシージャ BIASED-RANDOM です。ある確率 p で 1 を出力し、確率 1−p で 0 を出力します。ここで、0 < p < 1 ですが、p が何であるかはわかりません。サブルーチンとして BIASED-RANDOM を使用するアルゴリズムを与え、偏りのない答えを返し、確率 1/2 で 0 を返し、確率 1/2 で 1 を返します。p の関数としてのアルゴリズムの予想実行時間は?
解決策は次のとおりです。
偏りのないランダム ビットを取得するには、BIASED-RANDOM の呼び出しのみを指定して、BIASED-RANDOM を 2 回呼び出します。2 つの呼び出しが異なる値を返すまでこれを繰り返します。異なる値が返された場合は、2 つのビットの最初のビットを返します。
UNBIASED-RANDOM
while TRUE
do
x ← BIASED-RANDOM
y ← BIASED-RANDOM
if x != y
then return x
UNBIASED-RANDOM が 0 と 1 をそれぞれ確率 1/2 で返すことを確認するには、特定の反復で 0 が返される確率が次のようになることを確認します。
Pr {x = 0 and y = 1} = (1 − p)p ,
与えられた反復が 1 を返す確率は
Pr {x = 1 and y = 0} = p(1 − p) .
(BIASED-RANDOM によって返されるビットが独立していることに依存しています。) したがって、特定の反復で 0 が返される確率は、1 が返される確率と等しくなります。UNBIASED-RANDOM が値を返す方法は他にないため、返されます。確率 1/2 でそれぞれ 0 と 1。