生育问题

来源:互联网 发布:精度30米dem数据 编辑:程序博客网 时间:2024/04/27 07:55
说澳大利亚的父母喜欢女孩,如果生出来的第一个女孩,就不再生了,如果是男孩就继续生,直到生到第一个女孩为止,问若干年后,男女的比例是多少?
用程序验证基本上是1:1


view plain
  1. #include <stdio.h>  
  2. #include <stdlib.h>  
  3. #define MAN    1  //男孩  
  4. #define WOMAN  0  //女孩  
  5. static int g_iManNum = 0;  //男孩个数  
  6. static int g_iWoManNum = 0;  //女孩个数  
  7. static void AddOneMan()  
  8. {  
  9.     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,男孩小于女孩。我运行了多次,都是这个结果。从理论上来说,不一定”男孩个数一定小于女孩个数“,但是结果每次都是这样,可能是“男孩个数小于女孩个数”出现的几率比较高。

原创粉丝点击