zoukankan      html  css  js  c++  java
  • 概率题

    题:

    Please write out the program output.(写出下面程序的运行结果。)【德国某著名软件咨询企业2005年10月面试题】

    // P92_example1.cpp : Defines the entry point for the console application.
    //
    
    #include "stdafx.h"
    #include <stdlib.h>
    
    #define LOOP 1000
    
    int _tmain(int argc, _TCHAR* argv[])
    {
    	int rgnC = 0;
    	for(int i = 0; i < LOOP; i++)
    	{
    		int x = rand();
    		int y = rand();
    		if(x*x + y*y < RAND_MAX*RAND_MAX)
    			rgnC++;
    	}
    	printf("%d
    ", rgnC);
    	return 0;
    }
    


    解析:

    这是我们见过的概率面试题中出得非常好的一道。

    从表面上看,你完全无法看出它是一个概率问题。这里暗含的思想是一个1/4圆和一个正方形比较大小的问题,如图所示。


    RAND_MAX是随机数中的最大值,也就是相当于最大半径R。x和y是横、纵坐标的两点,它们的平方和开根号就是原点到该点(x,y)的距离,当然这个距离有可能大于R,如b点,还有可能小于R,如a点。整个题目就蜕化成这样一个问题:随机在正方形里落1000个点,落在半径里面的点有多少个。如果落在里面一个点,则累计一次。

            那这个问题就很好解决了,求落点可能性之比,就是求一个1/4圆面积和一个正方形面积之比。

    1/4圆面积 = (1/4)x π x r x r

    正方形的面积 = r x r

    两者之比 = π/4

    落点数 = π/4 x 1000 = 250 x π ≈ 785

    答案:

    出题者的意思显然就是要求你得出一个大概值,也就是250*π就可以了。实际上呢,你只要回答700~800之间都是正确的。

    我们算的是落点值,落点越多,越接近250*π,落10个点、100个点都是很不准确的,所以该题落了1000个点。读者可以上机验证该程序,将LOOP改成10000、100000来实验,会发现结果越来越接近250*π。

  • 相关阅读:
    Java知识15 Number&Math类【多测师】
    python callable()方法实例
    高级super实例
    高级any、for组合用法
    python 字典update、setdefault、pop方法案例
    一个经典的python字典生成式案例
    一个发挥到极致的yield案例
    python map使用
    Python yield详解
    django __path__使用
  • 原文地址:https://www.cnblogs.com/snake-hand/p/3161638.html
Copyright © 2011-2022 走看看