C#写的按照指数分布产生的随机数

来源:互联网 发布:日本动画片知乎 编辑:程序博客网 时间:2024/06/10 01:50

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

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

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

{
            Random rand = new Random(Guid.NewGuid().GetHashCode());
            double p = rand.NextDouble();
            double temp;
            if (const_a != 0)
                temp = 1 / const_a;
            else
                throw new System.InvalidOperationException("除数不能为零!不能产生参数为零的指数分布!");
            double randres;
            randres = -temp * Math.Log(temp * p*const_a, Math.E);
            return randres;
}

 

此处是别人的写的java中代码,可惜从数学上看写的不是很清楚

public  double exponential(Random rng, double mean)

{
  return -mean*Math.log( rng.nextDouble() );
 }

此代码也是对的,就是他把0~λ的随机数,进行了简化,本来取对数时的参数是(1/const_a)* p*const_a,化简以后就剩下一个p了,即rng.nextDouble() 。

两种方式都是对的,关键是看,传过来的参数是λ,还是指数分布的期望。再有一点就是随机数问题,这个一般系统提供的是一个伪随机,而且默认参数与系统时钟有关。

原创粉丝点击