📄 random_n.cpp
字号:
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
double u(void);
double normal(void);
double r(void);
int possion(void);
int main(void)
{
for (int i=1;i<=100;i++)
{
//printf("%lf\n",normal());
//printf("%lf\n",r());
printf("%d\n",possion());
}
return 0;
}
double u(void) //产生区间(0,1)上的均匀分布随机数
{
static double zi=10000,zi_1=10000;
double mod=pow(2,35)-31,a=pow(5,5);
zi_1=a*zi;
while (zi_1>=mod)
{
zi_1=zi_1-mod;
}
zi=zi_1;
return zi_1/mod;
}
double normal(void) //均值3.5,标准差5.8 的正态分布
{
double W=0;
double u1=0,u2=0;
double V1=0,V2=0;
do
{
u1=u();
u2=u();
V1=2*u1-1;
V2=2*u2-1;
W=V1*V1+V2*V2;
} while(W>1);
double x1=V1*sqrt((-2*log(W))/W);
double x2=V2*sqrt((-2*log(W))/W);
return 3.5+5.8*x1;
}
double r(void) //alpha=0.3, beta=4.0的r分布
{
double alpha=0.3,beta=4.0;
double b=(exp(1.0)+alpha)/exp(1.0);
double u1=0;
double u2=0;
double P=0;
double Y=0;
int t=1;
while (t>0)
{
u1=u();
u2=u();
P=b*u2;
Y=0;
if (P>1)
{
Y=-log((b-P)/alpha);
if (u1<pow(Y,alpha-1))
{
return Y;
}
else
{
continue;
}
}
else
{
Y=pow(P,1/alpha);
if (u1<exp(-Y))
{
return Y;
}
else
{
continue;
}
}
}
return 0;
}
int possion(void) //均值4.2的泊松分布
{
int i=0;
static double lemda=4.2;
double pi=exp(-lemda),pi_1=exp(-lemda);
double Fi=pi,Fi_1=Fi;
double ui_1=u();
if (ui_1<Fi)
{
return 1;
}
else
{
do
{
pi=pi_1;
Fi=Fi_1;
pi_1=lemda*pi/(i+1);
Fi_1=Fi+pi_1;
i=i+1;
}while (!(ui_1>=Fi && ui_1<Fi_1));
return i+1;
}
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -