2010年5月时,在51testing上写过一篇文章,关于C语言实现泊松分布随机。然后,估计能在搜索引擎中对相关的关键字排名处于前面,所以已经收到过多次有网友发email给我询问关于泊松分布的C代码的事情了,这不,这两天又有人问到我了。(其实,我已经将概率论中该忘记的东西都已经忘记了,呵呵。)
这也说明,那篇文章对一些网友有参考价值,所以我重新找到了以前写的那点仿真代码,然后把当时写的关于库存系统仿真的代码整体都放到了Github上了,见:
https://github.com/smilejay/c-cpp/tree/master/inventory-simulation
里面代码比较简陋,望大家有兴趣观赏时发现了bug或者设计的问题,请给我留言,以便我学习提高~
帮一个朋友做管理学科研究生阶段的一个作业,是对库存系统仿真,其中里面零售商的需求是泊松分布的随机数。需要用C语言产生泊松分布的随机数,通过找资料和编程实践,简单的程序写了出来,如下,供参考。
泊松分布随机数的算法如下:
Python
algorithm poisson random number (Knuth):
init:
Let L ← exp(−λ), k ← 0 and p ← 1.
do:
k ← k + 1.
Generate uniform. random number u in [0,1] and let p ← p × u.
while p >= L.
return (k − 1).
1
2
3
4
5
6
7
8
algorithmpoissonrandomnumber(Knuth):
init:
LetL←exp(−λ),k←0andp←1.
do:
k←k+1.
Generateuniform.randomnumberuin[0,1]andletp←p×u.
whilep>=L.
return(k−1).
C语言实现的泊松分布随机数的代码如下:
Python
#include
#include
#include
double U_Random();
int possion();
void main()
{
double u = U_Random();
int p = possion();
printf("%f\n",u);
printf("%d\n",p);
}
int possion() /* 产生一个泊松分布的随机数,Lamda为总体平均数*/
{
int Lambda = 20, k = 0;
long double p = 1.0;
long double l=exp(-Lambda); /* 为了精度,才定义为long double的,exp(-Lambda)是接近0的小数*/
printf("%.15Lf\n",l);
while (p>=l)
{
double u = U_Random();
p *= u;
k++;
}
return k-1;
}
double U_Random() /* 产生一个0~1之间的随机数 */
{
double f;
srand( (unsigned)time( NULL ) );
f = (float)(rand() % 100);
/* printf("%f\n",f); */
return f/100;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include
#include
#include
doubleU_Random();
intpossion();
voidmain()
{
doubleu=U_Random();
intp=possion();
printf("%f\n",u);
printf("%d\n",p);
}
intpossion()/*产生一个泊松分布的随机数,Lamda为总体平均数*/
{
intLambda=20,k=0;
longdoublep=1.0;
longdoublel=exp(-Lambda);/*为了精度,才定义为longdouble的,exp(-Lambda)是接近0的小数*/
printf("%.15Lf\n",l);
while(p>=l)
{
doubleu=U_Random();
p*=u;
k++;
}
returnk-1;
}
doubleU_Random()/*产生一个0~1之间的随机数*/
{
doublef;
srand((unsigned)time(NULL));
f=(float)(rand()%100);
/*printf("%f\n",f);*/
returnf/100;
}
参考资料:
关于这个简单的库存仿真的全部代码:https://github.com/smilejay/c-cpp/tree/master/inventory-simulation
最初写的这篇文章:http://www.51testing.com/?uid-225738-action-viewspace-itemid-214306