五千年(敝帚自珍)

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

共:💬53 🌺38
全看树展主题 · 分页首页 上页
/ 4
下页 末页
家园 俺在另一个帖子里回复你了

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

至于

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

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

家园 忽然发现我的算法也有问题

稍等一下,我吃完饭写个程序示范一下

家园 代码来了 -- 有补充

是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++;
 }

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

家园 老兄这话说的扭捏了

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

见前补充 4617473
家园 数学题最后变成语文题了

兄台谬赞,不敢当。

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

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

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

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

通宝推:唐家山,
家园 你的代码好像有问题

这段

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++;

}

问题出在这个“ else ”上。这里你进入选第二个男孩的条件是第一个孩子不为男。问题是,邻居要带第二个男孩出去的情况只有两种,BB 或 GB。你的条件把 GB 排除了。但也同时排除了 BB。 如果你在两个循环里各加一个 counter 看各自的积累,你会发现只有第一个循环起了作用,第二个循环的累积是 0。

这样你就没有真正模拟你自己在程序里想模拟的现象。

正确的模拟是把 “ else ”去掉,分母则是 老大、老二分别带出去散步的男孩的组合。组合见下表:

同行 留家
大哥(B1) 二哥(B2)
二哥(B2) 大哥(B1)
大哥(B1) 二姐(G2)
二哥(B2) 大姐(G1)

另一个孩子是男孩的几率是二分之一。

通宝推:唐家山,
家园 那个就是为了模拟啊

是写得太啰嗦了,思路如下:

如果家长带出来的是第一个孩子,且孩子是男孩,就检查第二个孩子是否是否男孩,如果也是,则计数器加一;

否则,如果家长带出来的是第二个孩子,且孩子是男孩,就检查第一个孩子是否男孩,如果是,则计数器加一。

由于开头已经把全是女孩的情况排除掉了,上述的如果。。。否则。。。一定会有一个成立。

写完我发现太啰嗦,等价的逻辑,其实就是:是否两个都是男孩!这个就简单多了。

家园 我试着用另一种角度解释一下这个问题 -- 有补充

看看能否说清楚。

首先把三门问题扩展到100门问题。100个门里只有一辆汽车,其余都是山羊。由于是等可能的,可以近似认为做100次实验,在100次实验里每个门里有且仅有一次是汽车。不失一般性,挑战者每次都选1号门,然后主持人打开98道有山羊的门,然后问挑战者是否换门。现在这个问题转化成做100次实验,挑战者换门和不换门成功的次数。这是一个确定性的问题,答案很显然,分别是1和99。

现在用同样的思路考虑两个孩子的问题。假设生男孩和女孩的概率相同。那么两个孩子共有4种可能,男男,男女,女男,女女。如果骰子掷四次,可以近似认为4种选项会各中一次。下面是最有争议的地方,”先看到了一个男孩“这句话到底是什么意思?我的理解是 对骰子的投掷情况进行了限制,如果投掷时选到女女选项,这次投掷就不算数。然后从男男,男女,女男 3个选项中选 男男,这个概率是三分之一。“先看到了一个男孩”这句话说完整了之后,就是"每次看到一个男孩后,问第二个孩子也是男孩的概率"。这句话等价于“如果第一次看到一个女孩,就当做没看见。只有第一次看到的是男孩时,我们才开始考虑第二个孩子是否也是男孩的概率”。

作者 对本帖的 补充(1)
家园 好像还是有点问题 -- 补充帖

“先看到一个男孩”是否与“家里至少存在一个男孩”等价?一男孩一女孩的家庭需要做两次实验才能确认“家里至少存在一个男孩”,而两男孩的家庭只要做一次实验就能确认。两者好像不是等可能的。让我再想想。

家园 在你说的基础上推理

用你投掷骰子的步骤来推理

现在用同样的思路考虑两个孩子的问题。假设生男孩和女孩的概率相同。那么两个孩子共有4种可能,男男,男女,女男,女女。如果骰子掷四次,可以近似认为4种选项会各中一次。下面是最有争议的地方,”先看到了一个男孩“这句话到底是什么意思?我的理解是 对骰子的投掷情况进行了限制,如果投掷时选到女女选项,这次投掷就不算数。然后从男男,男女,女男 3个选项中选 男男,这个概率是三分之一。“先看到了一个男孩”这句话说完整了之后,就是"每次看到一个男孩后,问第二个孩子也是男孩的概率"。这句话等价于“如果第一次看到一个女孩,就当做没看见。只有第一次看到的是男孩时,我们才开始考虑第二个孩子是否也是男孩的概率”。

你这里只刨除女女选项是不符合你自己的定义的。你自己说了“如果第一次看到一个女孩,就当做没看见。只有第一次看到的是男孩时,我们才开始考虑第二个孩子是否也是男孩的概率”。这个定义其实除掉了女男的选项。于是剩下的,只有男男,男女。所以概率还是二分之一啊。

家园 你这里的设定是错的

楼上唐家山的模式才是正确的描述。

“先看到了一个男孩”这句话说完整了之后,就是"每次看到一个男孩后,问第二个孩子也是男孩的概率"。这句话等价于“如果第一次看到一个女孩,就当做没看见。只有第一次看到的是男孩时,我们才开始考虑第二个孩子是否也是男孩的概率”。

很显然,原题是说你碰到邻居带了个男孩出来,邻居共有两个小孩,另一个没看见的小孩的性别未知。那么很显然,组合只可能是 男男,或是 男女。不存在女女,或女男的情况(因为你没看到女孩,只看到一个男孩)。那么另一个孩子是男孩的几率不就是二分之一吗?

见前补充 4617561
家园 “先看到一个男孩”与“家里至少存在一个男孩”不是等价的

“先看到一个男孩”讲顺序。所以说一下等效命题这个帖子里的等价命题里有

一对夫妻生了一个孩子,老婆怀着第二个。两人讨论第二个孩子的性别。老公认为第一个是男孩,所以第二个是女孩的几率上升到三分之二?请问对吗?以此类推,老婆怀了第十胎,前面九个都是男孩,那么第十个生女儿的几率多大?

这里也是有顺序的。先出生孩子等价于你看到的邻居的孩子,未出生的等价于你没看到那个。

而“家里至少存在一个男孩”则不讲顺序。所以男男,男女,女男都成立。

通宝推:唐家山,
家园 这个趣味数学题 (三)大概是你对了

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

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

家园 你这个是1/2

主帖的等效是这样:

已知:有两个孩子,其中至少有一个男孩

问:两个都是男孩的概率是多少?

这样就是1/3.

如果已知:有两个孩子,其中老大是男孩

问:老二是男孩的概率是多少?

那就是1/2。

你这个得表述为:两个硬币,已知其中有一个是正面朝上(但是不确定是哪个硬币),那么两个都朝上得概率是1/3;只要你明确了是哪个硬币正面朝上,概率就是1/2

全看树展主题 · 分页首页 上页
/ 4
下页 末页


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

Copyright © cchere 西西河