阿里巴巴的一道面试题:说澳大利亚的父母喜欢女孩,如果生出来的第一个女孩,就不再生了,如果是男孩就继续生,直到生到第一个女孩为止,问若干年后,男女的比例是多少?
刚看到问题是的思维逻辑:用递推法,假设一对夫妻,生了个女儿,就不再要了;另外一对夫妻,生了个儿子,再要一个,是女儿,然后也就不要了。第一感觉,应该是女的比男的多。然后思考如何证明这个结论。用数学可以证明,比如用归纳法,看看男女到底比例应该是多少。
后来用仔细考虑了一下:一个家庭如果一直没有生女孩,不是要生多个男孩才对一个女孩吗?女多于男的结论未必正确。我的一个同事坚持认为,女孩的个数一定多余男孩的个数。哈哈,真是这样吗?
有一点我后来考虑到了,就是生男和生女的几率都是一样的,是不是应该是1:1啊?用编程来验证一下。我写了一个下面的小程序来验证我的程序:
view sourceprint?01 #include <stdio.h>
02 #include <stdlib.h>
03 #define MAN 1 //男孩
04 #define WOMAN 0 //女孩
05 static int g_iManNum = 0; //男孩个数
06 static int g_iWoManNum = 0; //女孩个数
07 static void AddOneMan()
08 {
09 g_iManNum++;
10 }
11 static void AddOneWoman()
12 {
13 g_iWoManNum++;
14 }
15 static int GetOneChild()
16 {
17 return (rand()%2);
18 }
19 static void PrintResult()
20 {
21 printf("Man's number is %d, woman's number is %d.\n", g_iManNum,
22 g_iWoManNum);
23
24 float fResult = (float)g_iManNum / (float)g_iWoManNum;
25
26 printf("Man / Woman is [%f]\n", fResult);
27 }
28 static void OneFamilyGetChild()
29 {
30 int iChildType = GetOneChild();
31 if (MAN == iChildType)
32 {
33 //如果是男孩,则递归调用,再生一个小孩,直到生出一个女孩为止
34 AddOneMan();
35 OneFamilyGetChild();
36 }
37 else if (WOMAN == iChildType)
38 {
39 AddOneWoman();
40 }
41 else
42 {
43 printf("child type is error!\n");
44 exit(0);
45 }
46 }
47 static void StatisticsOfAllFamily(int iFamilyCount)
48 {
49 printf("Now family count is %d.\n", iFamilyCount);
50
51 int i = 0;
52 for (i = 0; i < iFamilyCount; i++)
53 {
54 OneFamilyGetChild();
55 }
56
57 PrintResult();
58 }
59 int main ()
60 {
61 srand(time(NULL));
62 StatisticsOfAllFamily(1000000);
63
64 return 1;
65 }
最终的结果是0.9996约等于1,男孩小于女孩。我运行了多次,都是这个结果。从理论上来说,不一定"男孩个数一定小于女孩个数",但是结果每次都是这样,可能是"男孩个数小于女孩个数"出现的几率比较高。
人的第一感觉(或第一印象)是如此的不靠谱。而人很多时候又对第一感觉十分的依赖。如何突破我们的第一感觉去抓住事物的本质,是一个需要我们深入思考的问题。
刚看到问题是的思维逻辑:用递推法,假设一对夫妻,生了个女儿,就不再要了;另外一对夫妻,生了个儿子,再要一个,是女儿,然后也就不要了。第一感觉,应该是女的比男的多。然后思考如何证明这个结论。用数学可以证明,比如用归纳法,看看男女到底比例应该是多少。
后来用仔细考虑了一下:一个家庭如果一直没有生女孩,不是要生多个男孩才对一个女孩吗?女多于男的结论未必正确。我的一个同事坚持认为,女孩的个数一定多余男孩的个数。哈哈,真是这样吗?
有一点我后来考虑到了,就是生男和生女的几率都是一样的,是不是应该是1:1啊?用编程来验证一下。我写了一个下面的小程序来验证我的程序:
view sourceprint?01 #include <stdio.h>
02 #include <stdlib.h>
03 #define MAN 1 //男孩
04 #define WOMAN 0 //女孩
05 static int g_iManNum = 0; //男孩个数
06 static int g_iWoManNum = 0; //女孩个数
07 static void AddOneMan()
08 {
09 g_iManNum++;
10 }
11 static void AddOneWoman()
12 {
13 g_iWoManNum++;
14 }
15 static int GetOneChild()
16 {
17 return (rand()%2);
18 }
19 static void PrintResult()
20 {
21 printf("Man's number is %d, woman's number is %d.\n", g_iManNum,
22 g_iWoManNum);
23
24 float fResult = (float)g_iManNum / (float)g_iWoManNum;
25
26 printf("Man / Woman is [%f]\n", fResult);
27 }
28 static void OneFamilyGetChild()
29 {
30 int iChildType = GetOneChild();
31 if (MAN == iChildType)
32 {
33 //如果是男孩,则递归调用,再生一个小孩,直到生出一个女孩为止
34 AddOneMan();
35 OneFamilyGetChild();
36 }
37 else if (WOMAN == iChildType)
38 {
39 AddOneWoman();
40 }
41 else
42 {
43 printf("child type is error!\n");
44 exit(0);
45 }
46 }
47 static void StatisticsOfAllFamily(int iFamilyCount)
48 {
49 printf("Now family count is %d.\n", iFamilyCount);
50
51 int i = 0;
52 for (i = 0; i < iFamilyCount; i++)
53 {
54 OneFamilyGetChild();
55 }
56
57 PrintResult();
58 }
59 int main ()
60 {
61 srand(time(NULL));
62 StatisticsOfAllFamily(1000000);
63
64 return 1;
65 }
最终的结果是0.9996约等于1,男孩小于女孩。我运行了多次,都是这个结果。从理论上来说,不一定"男孩个数一定小于女孩个数",但是结果每次都是这样,可能是"男孩个数小于女孩个数"出现的几率比较高。
人的第一感觉(或第一印象)是如此的不靠谱。而人很多时候又对第一感觉十分的依赖。如何突破我们的第一感觉去抓住事物的本质,是一个需要我们深入思考的问题。