| 偶做过的一道题: 
 报童问题:
 报童购进报纸价格B,零售价A,卖不完退回价C.A>B>C.
 当B=0.15   A=0.20   C=0.12  需求量均值500份,均方差50份正态分布,求报童每天要购进多少报纸才能使平均收入最高?最高收入是多少?如何用计算机实现?
 
 分析:
 报童在具有最大利润的份数外,再多购入一份报纸或者少购入一份报纸,所获得的利润(a-b)的概率与卖不出去赔钱(b-c)的概率都相等.
 假设需要的份数为f(x),则跟据概论关系,f(x)从0到n的积分应该等于(a-b)/(b-c).
 取一定的精度,累计相加从0到n,取到最大值就可以了。
 
 笔算结果:
 购进515.5份时收入最高。
 最高收入的数学期望是:24.535元。
 
 计算机模拟程序:
 /*
 Author: dcyu
 Date: 2003-06-01
 IDE:Visual C++6.0
 
 */
 #include <iostream>
 #include <time.h>
 #include <stdlib.h>
 #include <cmath>
 
 #define M_PI 3.14159265359
 
 using namespace std;
 
 double _random(void)
 {
 int a;
 double r;
 
 a=rand()%32767;
 r=(a+0.00001)/32767.00;
 
 return r;
 
 }
 
 double _sta2(double mu,double sigma)
 {
 double r1,r2;
 
 r1=_random();
 r2=_random();
 
 return sqrt(-2*log(r1))*cos(2*M_PI*r2)*sigma+mu ;
 
 }
 
 int main()
 {
 const double A = 0.20, B = 0.15, C =0.12;
 const int cnt = 10000;
 int Num, iCount, buy, left, sale, index;
 double Money, Max;
 
 srand( (unsigned)time( NULL ) );
 Max = -1000000.0;
 
 for(buy = 450; buy < 550; buy++)
 {
 Money = 0.0;
 for(iCount = 0; iCount < cnt; iCount++)
 {
 Num = (int)( _sta2(500, 50) );
 sale = buy > Num ? Num : buy;
 left = buy > Num ? buy - Num : 0;
 Money = Money + sale * ( A - B) - left * (B - C);
 
 }
 Money = Money / (cnt + 0.0);
 Max = Max > Money ? Max : Money;
 index = Max > Money ? index : buy;
 
 }
 
 cout<<"Optimum: "<<index<<endl;
 cout<<"Best sale: "<<Max<<endl;
 
 return 0;
 }
 
 |