阿里巴巴的一道面试题:说澳大利亚的父母喜欢女孩,如果生出来的第一个女孩,就不再生了,如果是男孩就继续生,直到生到第一个女孩为止,问若干年后,男女的比例是多少?
刚看到问题是的思维逻辑:用递推法,假设一对夫妻,生了个女儿,就不再要了;另外一对夫妻,生了个儿子,再要一个,是女儿,然后也就不要了。第一感觉,应该是女的比男的多。然后思考如何证明这个结论。用数学可以证明,比如用归纳法,看看男女到底比例应该是多少。
后来用仔细考虑了一下:一个家庭如果一直没有生女孩,不是要生多个男孩才对一个女孩吗?女多于男的结论未必正确。我的一个同事坚持认为,女孩的个数一定多余男孩的个数。哈哈,真是这样吗?
有一点我后来考虑到了,就是生男和生女的几率都是一样的,是不是应该是1:1啊?用编程来验证一下。我写了一个下面的小程序来验证我的程序:
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,男孩小于女孩。我运行了多次,都是这个结果。从理论上来说,不一定"男孩个数一定小于女孩个数",但是结果每次都是这样,可能是"男孩个数小于女孩个数"出现的几率比较高。
人的第一感觉(或第一印象)是如此的不靠谱。而人很多时候又对第一感觉十分的依赖。如何突破我们的第一感觉去抓住事物的本质,是一个需要我们深入思考的问题。
729

被折叠的 条评论
为什么被折叠?



