一 利用不均勻硬幣產生等概率
問題描述:有一枚不均勻的硬幣,拋出此硬幣后,可用foo()表示其結果。已知foo()能返回0和1兩個值,其概率分別為0.6和0.4。問怎么利用foo()得到另一個函數,使得返回0和1的概率均為0.5。
問題分析:分析連續拋出兩次硬幣的情況,正反面的出現有四種情況,概率依次為:
(1) 兩次均為正面:0.6*0.6=0.36
(2)第一次正面,第二次反面:0.6*0.4=0.24
(3)第一次反面,第二次正面:0.4*0.6=0.24
(4)兩次均為反面:0.4*0.4=0.16
可以看到中間兩種情況的概率是完全一樣的,於是問題的解法就是連續拋兩次硬幣,如果兩次得到的相同則重新拋兩次;否則根據第一次(或第二次)的正面反面情況,就可以得到兩個概率相等的事件。
1 int Coin() 2 { 3 while(true) 4 { 5 int a = foo(); 6 if(a != foo()) 7 { 8 return a; 9 } 10 } 11 }
二 利用均勻硬幣產生不等概率
問題描述:有一枚均勻的硬幣,拋出此硬幣后,可用foo()表示其結果。已知foo()能返回0和1兩個值,其概率均為0.5。問怎么利用foo()得到另一個函數,使得返回0和1的概率分別為0.3和0.7。
問題分析:0和1隨機生成,可以理解為二進制。可以令a=foo()*2^4+foo()*2^3+foo()*2^2+foo()*2^1+foo()等概率生成0-31的所有數,去掉30和31后,在0-29之間進行一個%3輸出。
1 int generator() 2 { 3 // 生成一個 0 - 31 之間的數字 4 return a = fun() * 2^4 + fun() * 2^3 + fun() * 2^2 + fun() * 2^1 + fun(); 5 } 6 7 int fun2() 8 { 9 int a = generator(); 10 11 // 縮減到 0 - 29 的范圍 12 while(a == 30 || a == 31){ 13 a = generator(); 14 } 15 // 3*1 - 3*9 共9個能被3 整除,返回0 16 // 剩余30 -9 = 21 個不能被整除,返回1 17 // 比例為9:21 = 3:7 18 if(a != 0){ 19 int b = a % 3; // 3*1 - 3*9 20 if(b == 0){ 21 return 0; 22 } 23 } 24 return 1; 25 }
轉自:http://www.cnblogs.com/youxin/p/3351216.html