C++生成正态分布样本、M-H采样

#include<bits/stdc++.h>
using namespace std;

typedef long long ll;
typedef vector<double> vec;
typedef vector<vec> mat;

const int INF=0x3f3f3f3f;
const int MAX_N=100;
const double PI=acos(-1.0);

double uniform(){//[0,1]均匀分布
    return (double)rand() / RAND_MAX;
}

double gaussrand(double E,double V){//均值E,标准差V
    static double V1, V2, S;
    static int phase = 0;
    double X;

    if ( phase == 0 ) {
        do {
            double U1 = (double)rand() / RAND_MAX;
            double U2 = (double)rand() / RAND_MAX;

            V1 = 2 * U1 - 1;
            V2 = 2 * U2 - 1;
            S = V1 * V1 + V2 * V2;
        } while(S >= 1 || S == 0);
        X = V1 * sqrt(-2 * log(S) / S);
    }
    else{
        X = V2 * sqrt(-2 * log(S) / S);
    }
    phase = 1 - phase;

    X = X * V + E;
    return X;
}

double get_gauss(double x,double E,double V){//正态分布函数,f(x),均值E,标准差V
    return (1/(sqrt(2*PI)*V))*exp(-1*(x-E)*(x-E)/(2*V*V));
}

int main()
{
    srand(time(NULL));
    double pi[10000];
    for(int i=1;i<10000;i++){
        double pi_star=gaussrand(pi[i-1],1);
        double alpha=min(1.0,get_gauss(pi_star,3,2)/get_gauss(pi[i-1],3,2));
        double u=uniform();
        if(u<alpha)pi[i]=pi_star;
        else pi[i]=pi[i-1];
    }
    for(int i=0;i<10000;i++){
        printf("%.12f,",pi[i]);
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值