2 つの乱数関数 f1()、f2() があります。
f1() は確率 p1 で 1 を返し、確率 1-p1 で 0 を返します。
f2() は確率 p2 で 1 を返し、確率 1-p2 で 0 を返します。
確率 p3(与えられた確率) で 1 を返し、確率 1-p3 で 0 を返す新しい関数 f3() を実装したいと思います。関数 f3() の実装では、関数 f1() と f2() を使用できますが、他のランダム関数は使用できません。
p3=0.5 の場合の実装例:
int f3()
{
do
{
int a = f1();
int b = f1();
if (a==b) continue;
// when reachs here
// a==1 with probability p1(1-p1)
// b==1 with probability (1-p1)p1
if (a==1) return 1;//now returns 1 with probability 0.5
if (b==1) return 0;
}while(1)
}
この f3() の実装は、確率 0.5 で 1 を返し、確率 0.5 で 0 を返すランダム関数を提供します。しかし、p3=0.4 で f3() を実装する方法は? 何も思いつきません。
その仕事は可能ですか?そして、f3() を実装する方法は?
前もって感謝します。