c – 具有Beta分布的随机数发生器

c – 具有Beta分布的随机数发生器,第1张

概述我需要像betarand(a,b)这样的函数的c或c源代码,它产生带有beta分布随机数.我知道我可以使用boost库但是我要将它移植到CUDA架构中,所以我需要代码.有人能帮助我吗? 同时我有betapdf(Beta概率密度函数).但我不知道如何使用它来创建随机数:). C 11随机数库不提供beta分布.但是,beta分布可以根据库提供的两个gamma分布来建模.我已经为你实现了一个 bet 我需要像betarand(a,b)这样的函数的c或c源代码,它产生带有beta分布的随机数.我知道我可以使用boost库但是我要将它移植到CUDA架构中,所以我需要代码.有人能帮助我吗?
同时我有betapdf(Beta概率密度函数).但我不知道如何使用它来创建随机数:).解决方法 C 11随机数库不提供beta分布.但是,beta分布可以根据库提供的两个gamma分布来建模.我已经为你实现了一个 beta_distribution的std :: gamma_distribution.据我所知,它完全符合随机数分布的要求.
#include <iostream>#include <sstream>#include <string>#include <random>namespace sftrabbit {  template <typename RealType = double>  class beta_distribution  {    public:      typedef RealType result_type;      class param_type      {        public:          typedef beta_distribution distribution_type;          explicit param_type(RealType a = 2.0,RealType b = 2.0)            : a_param(a),b_param(b) { }          RealType a() const { return a_param; }          RealType b() const { return b_param; }          bool operator==(const param_type& other) const          {            return (a_param == other.a_param &&                    b_param == other.b_param);          }          bool operator!=(const param_type& other) const          {            return !(*this == other);          }        private:          RealType a_param,b_param;      };      explicit beta_distribution(RealType a = 2.0,RealType b = 2.0)        : a_gamma(a),b_gamma(b) { }      explicit beta_distribution(const param_type& param)        : a_gamma(param.a()),b_gamma(param.b()) { }      voID reset() { }      param_type param() const      {        return param_type(a(),b());      }      voID param(const param_type& param)      {        a_gamma = gamma_dist_type(param.a());        b_gamma = gamma_dist_type(param.b());      }      template <typename URNG>      result_type operator()(URNG& engine)      {        return generate(engine,a_gamma,b_gamma);      }      template <typename URNG>      result_type operator()(URNG& engine,const param_type& param)      {        gamma_dist_type a_param_gamma(param.a()),b_param_gamma(param.b());        return generate(engine,a_param_gamma,b_param_gamma);       }      result_type min() const { return 0.0; }      result_type max() const { return 1.0; }      result_type a() const { return a_gamma.Alpha(); }      result_type b() const { return b_gamma.Alpha(); }      bool operator==(const beta_distribution<result_type>& other) const      {        return (param() == other.param() &&                a_gamma == other.a_gamma &&                b_gamma == other.b_gamma);      }      bool operator!=(const beta_distribution<result_type>& other) const      {        return !(*this == other);      }    private:      typedef std::gamma_distribution<result_type> gamma_dist_type;      gamma_dist_type a_gamma,b_gamma;      template <typename URNG>      result_type generate(URNG& engine,gamma_dist_type& x_gamma,gamma_dist_type& y_gamma)      {        result_type x = x_gamma(engine);        return x / (x + y_gamma(engine));      }  };  template <typename CharT,typename RealType>  std::basic_ostream<CharT>& operator<<(std::basic_ostream<CharT>& os,const beta_distribution<RealType>& beta)  {    os << "~Beta(" << beta.a() << "," << beta.b() << ")";    return os;  }  template <typename CharT,typename RealType>  std::basic_istream<CharT>& operator>>(std::basic_istream<CharT>& is,beta_distribution<RealType>& beta)  {    std::string str;    RealType a,b;    if (std::getline(is,str,'(') && str == "~Beta" &&        is >> a && is.get() == ',' && is >> b && is.get() == ')') {      beta = beta_distribution<RealType>(a,b);    } else {      is.setstate(std::ios::failbit);    }    return is;  }}

像这样使用它:

std::random_device rd;std::mt19937 gen(rd());sftrabbit::beta_distribution<> beta(2,2);for (int i = 0; i < 10000; i++) {  std::cout << beta(gen) << std::endl;}
总结

以上是内存溢出为你收集整理的c – 具有Beta分布的随机数发生器全部内容,希望文章能够帮你解决c – 具有Beta分布的随机数发生器所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1243373.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存