成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

用程序消除一道概率題的二義性

littlelightss / 3436人閱讀

摘要:以下是對史密斯先生有兩個孩子的可能情況進(jìn)行描述,其中函數(shù)隨機(jī)返回或的概率均為用于模擬現(xiàn)實(shí)中生男孩女孩的概率各一半。

??無意在維基看到了一個關(guān)于概率悖論的討論Boy or Girl paradox。有爭議的的題目如下:
??史密斯先生有兩個孩子,至少其中之一是男孩,請問兩個孩子都是男孩的可能性有多大?
??原文如下:
??Mr. Smith has two children. At least one of them is a boy. What is the probability that both children are boys?
??一部分人的答案是1/3,一部分人的答案是1/2.為什么會產(chǎn)生這樣的結(jié)果呢,文中說得很清楚是因?yàn)閱栴}本身存在歧義,對“至少一個孩子是男孩”的信息做不同的假設(shè),導(dǎo)致了不同的結(jié)果。問題歸根結(jié)底是由于自然語言的二義性,將問題轉(zhuǎn)化成了兩個不同的數(shù)學(xué)模型,從而產(chǎn)生了兩個不同的結(jié)果。我們知道設(shè)計一種編程語言的任務(wù)之一就是消除其二義性,因此一般而言編程語言是一種沒有歧義的語言(所以程序員都喜歡寫代碼不喜歡說話么),如果用編程語言來描述這一問題,會不會好理解點(diǎn)呢?以java為例,我們來看看。
??以下是對史密斯先生有兩個孩子的可能情況進(jìn)行描述,其中random.nextBoolean()函數(shù)隨機(jī)返回true或false的概率均為1/2,用于模擬現(xiàn)實(shí)中生男孩女孩的概率各一半??梢姵绦虿粌H描述了所有的組合,還明確了題目中暗含的條件。

 class TwoChildren
    {
        Child child1;
        Child child2;
        public TwoChildren()//一個孩子是男孩或女孩的概率是50%
        {
            child1 = random.nextBoolean()?Child.BOY:Child.GIRL;
            child2 = random.nextBoolean()?Child.BOY:Child.GIRL;
        }
    }

??接著描述“至少一個孩子是男孩”,因?yàn)檫@里是存在歧義的地方,所以轉(zhuǎn)化成代碼描述時,我們會根據(jù)兩個不同的假定,得到不同的代碼。1/3結(jié)果的假定條件:觀察了史密斯的兩個孩子,其中一個是男孩:

boolean isObserved(TwoChildren draw) 
{
    return draw.child1 == Child.BOY || draw.child2 == Child.BOY;
}

熟悉java的程序員會注意到,如果child1為BOY的話,child2不會被觀察(||運(yùn)算符后面的代碼不會被執(zhí)行),是否和自然語言描述不一樣?我們從邏輯或運(yùn)算定義可知二者是等價的,即使||運(yùn)算符后面的代碼被執(zhí)行,也不影響程序結(jié)果,換成自然語言就是我們觀察史密斯的兩個孩子時,一個一個的觀察,如果發(fā)現(xiàn)其中一個是男孩,就已經(jīng)保證了“至少一個是男孩”,就沒必要接著觀察了。
??接著描述1/2的結(jié)果假定條件:隨機(jī)觀察了史密斯的一個孩子,其中一個是男孩:

boolean isObserved(TwoChildren draw) 
{
    return random.nextBoolean()?draw.child1 == Child.BOY:draw.child2 == Child.BOY;
}

其中random.nextBoolean()函數(shù)隨機(jī)返回true或false的概率均為1/2,就是兩個孩子被選中觀察的概率是1/2.

最后我們描述問題的提出

if(isObserved(draw))
{
    observedCount ++;
    if(draw.child1 == Child.BOY && draw.child2 == Child.BOY)
    {//兩個孩子都是男孩
        matchedCount++;
      //經(jīng)過很多次運(yùn)算后,((double)matchedCount/observedCount)最可能的值是多少?
    }
}

??至此我們將一個以自然語言描述的問題,轉(zhuǎn)化成了一個以程序語言描述的問題。這個轉(zhuǎn)化是否正確呢,我們做10萬次測試,看結(jié)果是否滿足數(shù)學(xué)推導(dǎo)的預(yù)期。以下是一個完整的測試代碼:

package hermitdl.test2;

import java.util.Random;

/**
 * Test for <>
 */
public class App 
{
    static enum Child
    {
        BOY,
        GIRL
    };
    
    static Random random = new Random();
    
    static class TwoChildren
    {
        Child child1;
        Child child2;
        public TwoChildren()//一個孩子是男孩或女孩的概率是50%
        {
            child1 = random.nextBoolean()?Child.BOY:Child.GIRL;
            child2 = random.nextBoolean()?Child.BOY:Child.GIRL;
        }
    }
    //隨機(jī)檢查一個孩子的性別是否是男孩
    static class PeekOneTest extends ProbabilityTest
    {
        @Override
        boolean isObserved(TwoChildren draw) 
        {
            return random.nextBoolean()?draw.child1 == Child.BOY:draw.child2 == Child.BOY;
        }
    }
    //檢查兩個孩子的性別,是否其中之一是男孩
    static class PeekTwoTest extends ProbabilityTest
    {
        @Override
        boolean isObserved(TwoChildren draw) 
        {
            return draw.child1 == Child.BOY || draw.child2 == Child.BOY;
        }
    }
    
    
    static abstract class ProbabilityTest
    {
        int observedCount = 0;
        int matchedCount = 0;
        //在isObserved為真的情況下計數(shù),以及兩個孩子均是女孩的情況計數(shù)。
        void test(TwoChildren draw)
        {
            if(isObserved(draw))
            {
                observedCount ++;
                if(draw.child1 == Child.BOY && draw.child2 == Child.BOY)
                {
                    ////兩個孩子都是男孩
                    matchedCount++;
                }
            }
        }
        abstract boolean isObserved(TwoChildren draw);
        
        void printResult()
        {
            System.out.printf(this.getClass().getSimpleName() +"=%d/%d=%f
"
            ,matchedCount
            ,observedCount
            ,((double)matchedCount/observedCount));
        }
    }
    
    public static void main( String[] args )
    {
        PeekOneTest peekOneTest = new PeekOneTest();
        PeekTwoTest peekTwoTest = new PeekTwoTest();
        TwoChildren draw;
        for(int i = 0;i < 1000000; i++)
        {
            draw = new TwoChildren();
            peekOneTest.test(draw);
            peekTwoTest.test(draw);
        }
        peekOneTest.printResult();
        peekTwoTest.printResult();
    }
}

以下為程序的幾次運(yùn)行結(jié)果:
PeekOneTest=249436/499301=0.499570
PeekTwoTest=249436/750234=0.332478

PeekOneTest=250209/500229=0.500189
PeekTwoTest=250209/749846=0.333681

PeekOneTest=249963/500234=0.499692
PeekTwoTest=249963/749712=0.333412

??可見模擬結(jié)果始終分別在1/2與1/3附近波動,是符合數(shù)學(xué)預(yù)期的。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/72121.html

相關(guān)文章

  • 程序消除一道概率題的義性

    摘要:以下是對史密斯先生有兩個孩子的可能情況進(jìn)行描述,其中函數(shù)隨機(jī)返回或的概率均為用于模擬現(xiàn)實(shí)中生男孩女孩的概率各一半。 ??無意在維基看到了一個關(guān)于概率悖論的討論Boy or Girl paradox。有爭議的的題目如下:??史密斯先生有兩個孩子,至少其中之一是男孩,請問兩個孩子都是男孩的可能性有多大???原文如下:??Mr. Smith has two children. At leas...

    JackJiang 評論0 收藏0
  • [Java] 關(guān)于一道面試題的思考

    摘要:對于這種會退出的情況,數(shù)組顯然不能像鏈表一樣直接斷開,因此采用標(biāo)記法先生成一個長度為的布爾型數(shù)組,用填充。中對整個進(jìn)行遍歷才能得到此時數(shù)組中的數(shù)量。 文中的速度測試部分,時間是通過簡單的 System.currentTimeMillis() 計算得到的, 又由于 Java 的特性,每次測試的結(jié)果都不一定相同, 對于低數(shù)量級的情況有 ± 20 的浮動,對于高數(shù)量級的情況有的能有 ± 10...

    rozbo 評論0 收藏0
  • 精讀《手寫 SQL 編譯器 - 文法介紹》

    摘要:一般用大寫的表示文法的開頭,稱為開始符號。更多討論討論地址是精讀手寫編譯器文法介紹如果你想?yún)⑴c討論,請點(diǎn)擊這里,每周都有新的主題,周末或周一發(fā)布。 1 引言 文法用來描述語言的語法規(guī)則,所以不僅可以用在編程語言上,也可用在漢語、英語上。 2 精讀 我們將一塊語法規(guī)則稱為 產(chǎn)生式,使用 Left → Right 表示任意產(chǎn)生式,用 Left => Right 表示產(chǎn)生式的推導(dǎo)過程,比如對...

    TNFE 評論0 收藏0
  • 一篇算法講解的注解

    摘要:前言從公式到算法之前的完整路徑應(yīng)該是數(shù)學(xué)公式中文公式中文算法英文算法偶然看到一篇算法文章,講解了百度校園招聘之編程題的核心算法思路,我根據(jù)它又整理出自己的解題思路。 前言 從公式到算法之前的完整路徑應(yīng)該是:數(shù)學(xué)公式->中文公式->中文算法->英文算法 偶然看到一篇算法文章,講解了百度2016校園招聘之編程題的核心算法思路,我根據(jù)它又整理出自己的解題思路。 第一題 題目在原文中可以找到,...

    fevin 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<