手动生成伪随机数C++源代码

乘同余法产生(0,1)均匀分布的伪随机数

乘同余法的计算公式为:
x i = A x j − 1 ( Mod ⁡ M ) x_{i}=A x_{j-1}(\operatorname{Mod} M) xi=Axj1(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=Axi1[Axi1/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,0x10,
分布函数:
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{Xx}=xf(x)dx=x

逆变法的步骤:
  1. 已知F(x),或由f(x)F(x)
  2. 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)
  3. 推导 x = F − 1 ( y ) x=F^{-1}(y) x=F1(y)
  4. 产生 y ∈ U ( 0 , 1 ) y\in U(0,1) yU(0,1)
  5. x = F − 1 ( y ) x=F^{-1}(y) x=F1(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,,xi1,xi
逆变法产生负指数分布的伪随机数

首先产生 U ∈ U ( 0 , 1 ) U \in U(0,1) UU(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;
  }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值