西西河

主题:【讨论】【跟进】趣味数学题 (三) -- 数值分析

共:💬53 🌺38 新:
分页树展主题 · 全看 下页
  • 家园 【讨论】【跟进】趣味数学题 (三)

    这个帖子是 我 数值分析:【讨论】【跟进】趣味数学题 (二) 的跟进.

    这人气真是个奇妙的东西,我自己发的故事自己讨论,热度和 @任爱杰 老兄的转载帖子完全没得比,可以说应者寥寥啊. 不过在不多的回复中,

    @审度 审度:题不达意呗 和 @孟词宗

    孟词宗:原题本身表述不清吧 两位同学 指责我原来的题目表述不严谨,是误导观众.

    这里先澄清一下.原始的故事并不是我发在西西河里的,而是发在另一个地方.并且在首发的时候也不是作为一个帖子,而是一篇日志.日志么,主要是记录自己生活中的有趣的想法,本意并不在严肃讨论,而是开玩笑性质更多. @ 孟词宗 老兄 也在那里,应该知道我在首发的时候也明确说了,这篇故事的目的不过是 "碰瓷,骗点点击"

    蒙 @任爱杰 同学不弃,将我那篇转到了河里,才引起了很多严肃的讨论. 这在上一篇里我已经感谢过了.

    既然大家这么有兴致,不妨我把这个故事改写得严密一些,因为老铁不允许修改原帖,我把新的版本写在这里如下:

    -----------------------------------------

    今天听到一个例子,很适合说明怎么叫概率推断,或者概率推断会有多反直观.

    比如新来了一家邻居,我知道该邻居家有两个孩子,但不知道任何关于这两个孩子的其他情况.

    有一天我出门正看见新邻居正拿着全套的星战行头回家,突然意识到今天是5月4日,于是上前和邻居打招呼到:"May the force be with you!".邻居认出我来,显得颇有些尴尬,赶忙解释道"不不,这不是我的,是我给我儿子买的,他是个星战迷."

    我心里默默推算,嗯,原来邻居有个儿子,那么邻居家另一个孩子也是男孩的概率为三分之一(对,这不是笔误,三分之一,不是二分之一).


    本帖一共被 1 帖 引用 (帖内工具实现)
    • 家园 俺在另一个帖子里回复你了

      帖子在这里你仍在误导读者,但还是没做好

      至于

      孟词宗 老兄 也在那里,应该知道我在首发的时候也明确说了,这篇故事的目的不过是 "碰瓷,骗点点击"

      不好意思,俺被爱坛封口很久了。具体经过可看此帖软件加上历史等于什么?

    • 家园 修正之前回复:所以说辞不达意

      所以说辞不达意

      其实我想的是那家人孩子男女分布、大小分布的问题,表述出来是那家人另一个孩子是男是女问题。

      奔波儿河友表述的是你所说的问题。

      你所想的问题是:这两个孩子都是男的,且另外一个小的概率。现象无非女大女小,女大男小,男大男小,男大女小,每一个组合的概率1/4。但是对于眼前这个,你的处理就很特别了,在考虑大小的时候,把性别给考虑进去了:女大女小,女小女大,男大女小,男大男小,男小女大,男小男大,一共6个组合。已知一个是男,那么另一个是男的机率当然是2/6=1/3。所以你的问题是:已知那家人有两个孩子,在不知一个是男孩的前提下,且在已知道一个是男孩的前提下,排列两个孩子的大小,不考虑两个孩子大小排列结果的情况下,另一个是男孩的概率是多少。——条件很拧巴,有相互否定,所以得出的计算结果也很拧巴。

      后面的3/7,1/2也是如此。并不是统计结果反常式,是统计条件反逻辑。

    • 家园 的确这种表述更精确,我前面的帖子也有不够严谨之处

      或者说语义的歧义之处。我把这个问题说出“遇到”男孩,仍然不够准确,应该说“遇到有”男孩的家庭才对。否则会引入一个“带男”还是“带女”出来见人的先验概率,对答案的影响是在1/3和100%中变动。

      如果二者概率50%,答案还真是1/2,如果是个宠女狂魔,“有女必带”,则另一个是男孩的概率为100%,我的理解相当于“有男必带”,于是得到1/3。

      不少同学可能是基于这里的原因选择1/2,那也不能说错,比如zero999

      同学,【讨论】趣味数学题

      • 家园 老兄这话说的扭捏了

        啥叫zero999选1/2不能说错。这类问题,如果不特别指出,缺省不会对带男孩还是带女孩做区别对待。当然你所说的宠女狂魔和有难必带导出的结论都是成立的。

      • 家园 其实这里是有"扣子"的,不知diamond老兄看出来了否

        首先感谢diamond老兄回复.我在老兄的大作里学到不少东西,特致谢忱.

        其实我觉得很多人是不自觉的扩大了样本空间,把已经发生的事情放到概率里面考虑来了.比如看到邻居带出一个孩子,就考虑邻居带出这个孩子的概率.这其实是不对的.

        在这里,我故意让邻居在最后多说了一句"他是星战迷".前面双眼皮的例子说明,更多的信息是有可能进一步改变样本空间的.这里要不要考虑"星战迷"这个信息?把孩子分成"星战迷"和"非星战迷",进而修正我们的估计?答案是不需要,因为我们不知道"星战迷"和"非星战迷"的概率,而且也不能简单假设1/2,(显然星战迷的概率不可能是1/2),所以我们无法运用这个信息,所以我们可以安全忽略这个信息,就接受这是个客观事实即可.

        同样,看到邻居带出来一个孩子,这是一个客观事实,是已经决定的事情,我们完全可以忽略这个信息,就当他是个已经发生的事实,而不考虑带出哪个孩子的概率.有些同学假设家里有两个孩子,父母带出其中某一个孩子的概率就是1/2,这是不对的.万一当地的风俗是女孩不出门,家长只能带男孩子出门而女孩子只能留在家呢?我们不知道,所以应该存而不论.

        就像现在这个版本里的星战行头,那我们要不要可考虑我邻居没买星战行头,而是买了彩虹小马,带回家来,而他闺女是彩虹小马的粉丝的情况呢?显然没有这个必要.

        • 家园 数学题最后变成语文题了

          兄台谬赞,不敢当。

          个人觉得吧,细究起来,“带男孩子玩具回家”和“带男孩子出来被遇到”还真不一样,前者的等效描述是“家里有至少一个男孩”,后者是“家里有至少一个男孩,并且被带出门了”,实际上多了一个条件,而且影响概率的。

          如果是后者的话,样本空间里除了去掉女女 ,还需要去掉一男一女且女孩被带出门的25%,再算下来就是1/2了。

          我猜很多同学都是在这个隐含假设下考虑的。

          至于“星战迷”这件事情,恐怕会轻微增大男孩的概率,和“双眼皮”的效果类似。严格论起来,不能因为我们不知道某个先验概率就不予考虑,只能说条件不明确,无法得到量化的结果。貌似任何不起眼的细节都会有影响,比如告诉你那个孩子叫“汤姆”,会不会影响概率?细想之下都不敢乱说话了,哈哈。

          通宝推:唐家山,
    • 家园 所以说辞不达意 -- 有补充

      其实我想的是那家人孩子男女分布、大小分布的问题,表述出来是那家人另一个孩子是男是女问题。

      懒厨河友表述的是你所想的问题,奔波儿河友表述的是你所说的问题。

      作者 对本帖的 补充(1)
      家园 所以说辞不达意 -- 补充帖

      其实我想的是那家人孩子男女分布、大小分布的问题,表述出来是那家人另一个孩子是男是女问题。

      懒厨河友表述的是你所想的问题,奔波儿河友表述的是你所说的问题。

      也不对,懒厨河友的问题应该改为:不管等一个硬币是字是花。两个硬脂同为字的机率是多少。因为1/3的推导,完全不考虑开出的那个的结果。考虑了,还上1/3。

    • 见前补充 4617408
    • 家园 为什么不是一儿一女和两个儿子的可能各占一半呢?

      注意,我问的不是为什么像你说的那样,是为什么不像我说的那样,你能回答么?

      也许再争下去也没意义,不如用计算机模拟一下,我就写了个程序来模拟结果是1/2,把代码贴出来请你指正,最好也让我看一下你自己写的,如果你名副其实,应该不难吧。

      #include <stdio.h>
      #include <stdlib.h>
      #include <time.h>
      int main()
      {
       int a;
       int b1=0;
       int b2=0;
       int i=0;
       srand((unsigned)time(NULL));
       for(i=0;i<10000;i++)
       {
       a = rand();
       if((a&6)==6)//see older boy
       {
       b1++;
       if((a&1)==1)b2++;
       }
       else if((a&5)==1)//see younger boy
       {
       b1++;
       if((a&2)==2)b2++;
       }
       }
       printf("%d\t%d\t%f\n", b2,b1,(float)b2/(float)b1);
       return 0;
      }
      
      关键词(Tags): #include
      • 家园 你的模拟不够逼真

        仔细看了一下你的代码,严格的模拟应该是这样的:

        循环10000次

        两个随机变量K1, K2 代表两个孩子,其值为0则代表为男孩,1代表为女孩。

        再随机从K1,K2挑一个出来,如果其值为0则将K1,K2放入某个数组,(0代表第一次见到的男孩,如果抽到女孩则放弃,不符合条件,不用放入数组)

        该数组有三个字段(K1,K2, FirstMeet)FirstMeet字段代表抽中的是是K1还是K2

        循环完毕之后,再对数组进行统计,算法如下:

        对数组进行循环,

        如果FirstMeet==K1,且K2==0 则BoyCount++

        如果FirstMeet==K2, 且K1==0, 则BoyCount++

        最后计算 BoyCount/数组总量,得出结果

        这个才是逼真的模拟

        • 家园 不如写代码还看得清楚点
          • 家园 代码来了 -- 有补充

            是Java写的,写得急了点,将就看吧:

            package com.mycompany.app;
            import java.util.ArrayList;
            import java.util.List;
            import java.util.Random;
            /**
             * Hello CCHere!
             *
             */
            class Stat
            {
             public boolean k1; 
             public boolean k2; 
             };
            public class App 
            {
             //true is a boy, false is a girl
             //true if k1 is selected, false if k2 is selected for the first meeting
             public static boolean getRandomTrueOrFalse() { 
             Random random = new Random();
             return random.nextBoolean();
             
             }
             public static void main( String[] args )
             {
             boolean k1;
             boolean k2;
             float anotherKidIsBoyCount;
             
             List<Stat> ls = new ArrayList<Stat>();
             
             for (int i=0; i<10000; i++) {
             k1 = getRandomTrueOrFalse();
             k2 = getRandomTrueOrFalse();
             if (k1 || k2 ) { //if one of the kid is a boy, add they to the statistic list. The two girl scenario can be removed
             Stat st = new Stat();
             st.k1 = k1;
             st.k2 = k2;
             ls.add(st);
             }
             }
             anotherKidIsBoyCount=0;
             for (Stat st : ls) {
             if (st.k1) { //if first kid is selected and first kid is a boy
             if (st.k2) {// if second kid is a boy, increase the counter
             anotherKidIsBoyCount++;
             } 
             }
             else {
             if (st.k2) { // if 2nd kid is selected , and second it is a boy
             if (st.k1) { //if first kid is a boy, increase the counter
             anotherKidIsBoyCount++;
             }
             }
             }
             }
             System.out.println("cchere math question answer: " + String.valueOf( anotherKidIsBoyCount/ls.size())); 
             }
            }
            

            输出是:

            cchere math question answer: 0.33188406

            作者 对本帖的 补充(1)
            家园 要解释一下这段代码 -- 补充帖
            if (st.k1) { //if first kid is selected and first kid is a boy
             if (st.k2) {// if second kid is a boy, increase the counter
             anotherKidIsBoyCount++;
             } 
             }
             else {
             if (st.k2) { // if 2nd kid is selected , and second it is a boy
             if (st.k1) { //if first kid is a boy, increase the counter
             anotherKidIsBoyCount++;
             }
             }
             }

            这段代码有其实可以简化为

             if (st.k1 && st.k2) {
             anotherKidIsBoyCount++;
             }
            

            我写得那么麻烦,存粹就是为了模拟见到第一个,检查第另一个孩子的场景。

            • 家园 这个趣味数学题 (三)大概是你对了

              最开始那个不一样,因为看见什么和有什么不是一回事,在一儿一女的家庭里,先看见的也可能是女儿,虽然那个问题中没提到,但我认为有一半的可能会是这种情况,那么我们要考虑的一儿一女的家庭也只是其中的一半,答案是1/2。如果在一儿一女的家庭中先看见的一定是儿子,那就是条件概率了,答案是1/3,但我没看见这样的理由。

              你的程序我真不喜欢,你关于怎么写程序的意见我也没兴趣。如果你那么喜欢List,就不该用需要编译和List都需要import的语言,那真是很麻烦,也许Javascript更适合你。

              • 家园 我大学毕业后就没写过C了

                读大学的时候最喜欢的就是C,可惜毕业之后没机会用。

                昨晚写的时候,手头正好有Java,顺便就用了。用List的原因是想模拟的逼真一点,毕竟能纳入统计的家庭不是一个固定的数字,用数组不是十分理想。

                不是商用的仿真了,数据量也不大,对性能没啥要求,你将就一下吧

分页树展主题 · 全看 下页


有趣有益,互惠互利;开阔视野,博采众长。
虚拟的网络,真实的人。天南地北客,相逢皆朋友

Copyright © cchere 西西河