不均勻硬幣等概率問題


一  利用不均勻硬幣產生等概率

問題描述:有一枚不均勻的硬幣,拋出此硬幣后,可用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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM