产生按指数分布的随机数----摘自csdn

来源:互联网 发布:淘宝网中年男装裤子 编辑:程序博客网 时间:2024/04/29 03:09

最近在写一个排队系统的仿真程序,中间因为系统的服务时间和到来时间都是按照指数分布产生的,所以就在网上找了一下,发现没有,也有可以参考的,可是从数学角度分析一下,发现都是错的,哎,求人不如求己,还是自己动手写吧。

 

代码贴在下面,做点贡献吧,此代码是按照严格的数学关系产生的,在最后附上一个别人写的程序,指出其问题所在。

 

public static double RandExp(double const_a)//此处的const_a是指数分布的那个参数λ

 


         {

 

            //此处属于技巧,利用GUID产生随机数的种子,模拟真正的随机
             Random rand = new Random(Guid.NewGuid().GetHashCode());
             double p ;
             double temp;
             if (const_a != 0)
                 temp = 1 / const_a;
             else
                 throw new System.InvalidOperationException("除数不能为零!不能产生参数为零的指数分布!");
             double randres;
             //while((randres = -temp * Math.Log(temp * p, Math.E)) > 0);
             //while ((p = rand.NextDouble()) > const_a) ;
             while (true) //用于产生随机的密度,保证比参数λ小
             {
                 p = rand.NextDouble();
                 if (p < const_a)
                     break;
             }
             randres = -temp * Math.Log(temp * p, Math.E);
             return randres;
         }

 

 

 

此处是别人的写的java中代码,有可能还是一大牛,banks写的,可惜从数学上是不对的

 

public  double exponential(Random rng, double mean) {
   return -mean*Math.log( rng.nextDouble() );
  }

 

原因是:

 

产生指数分布随机数是按照,指数分布的密度函数为基础产生的,大家仔细看看那个指数分布的密度函数,就可以发现,指数分布的密度函数的值是在0-λ之间的,也就是说如果rng.nextDouble()> λ的情况下,得到的将是一个负数,我想任何有过概率论基础的人都会明白了,指数分布中的那个X是要大于零的。

 

也就是去倒数和于λ比较这两部分,不论你怎么写都是必须的。

 

 

 

最后再告诉一个数学中公理,解决数学问题的形式可以不同,但是所用的原理一般是要相同的,这也就是万法归一,大道唯一。

原创粉丝点击