乘同余法产生(0,1)均匀分布的伪随机数
乘同余法的计算公式为:
x
i
=
A
x
j
−
1
(
Mod
M
)
x_{i}=A x_{j-1}(\operatorname{Mod} M)
xi=Axj−1(ModM)
或者
x
i
=
A
x
i
−
1
−
[
A
x
i
−
1
/
M
]
M
x_{i}=A x_{i-1}-\left[A x_{i-1} / M\right] M
xi=Axi−1−[Axi−1/M]M
/*date:2020年2月22日
Author:Chauncy_xu*/
#include<iostream>
#include<math.h>
using namespace std;
int main()
{
int n;
cout<<"伪随机数个数:"<<endl;
cin>>n;
int number[n];
double pse_number[n];
number[0]=1;
int A=3,M=16;
for(int i=1;i<n;i++)
{
number[i]=(A*number[i-1])%M;
}
for(int i=0;i<n;i++)
{
pse_number[i]=float(number[i])/float(M);
}
for(int i=0;i<n;i++)
{
cout<<pse_number[i]<<endl;
}
return 0;
}
逆变法生成负指数分布的伪随机数
逆变法
密度函数:
f
(
x
)
=
{
1
,
0
≤
x
≤
1
0
,
其
它
f(x)=\left\{\begin{array}{l} {1,0 \leq x \leq 1} \\ {0, 其它} \end{array}\right.
f(x)={1,0≤x≤10,其它
分布函数:
F
(
x
)
=
P
x
{
X
≤
x
}
=
∫
−
∞
x
f
(
x
)
d
x
=
x
F(x)=P_{x}\{X \leq x\}=\int_{-\infty}^{x} f(x) d x=x
F(x)=Px{X≤x}=∫−∞xf(x)dx=x
逆变法的步骤:
- 已知F(x),或由f(x)求F(x)
- 即 F ( x ) = ∫ − ∞ x f ( x ) d x F(x)=\int_{-\infty}^{x} f(x) d x F(x)=∫−∞xf(x)dx令 y = F ( x ) y=F(x) y=F(x)
- 推导 x = F − 1 ( y ) x=F^{-1}(y) x=F−1(y)
- 产生 y ∈ U ( 0 , 1 ) y\in U(0,1) y∈U(0,1)
- 用 x = F − 1 ( y ) x=F^{-1}(y) x=F−1(y)得到 x 0 , x 1 , x 2 , ⋯ , x i − 1 , x i x_{0},x_{1},x_{2},\cdots,x_{i-1},x_{i} x0,x1,x2,⋯,xi−1,xi
逆变法产生负指数分布的伪随机数
首先产生 U ∈ U ( 0 , 1 ) U \in U(0,1) U∈U(0,1),然后用 X = − 1 λ l n U X=-\frac{1}{\lambda} \mathrm{ln} U X=−λ1lnU
/*date:2020年2月22日
Author:Chauncy_xu*/
#include<iostream>
#include<math.h>
using namespace std;
int main()
{
int n;
cout<<"伪随机数个数:"<<endl;
cin>>n;
int number[n];
double pse_number[n];
double com_index[n];
number[0]=1;
int A=3,M=16,lambda;
cout<<"输入负指数分布的参数:"<<endl;
cin>>lambda;
for(int i=1;i<n;i++)
{
number[i]=(A*number[i-1])%M;
}
for(int i=0;i<n;i++)
{
pse_number[i]=float(number[i])/float(M);
com_index[i]=(-1)*log(pse_number[i])/lambda;
}
for(int i=0;i<n;i++)
{
cout<<com_index[i]<<endl;
}
return 0;
}