如何使boost::exponential_distribution工作

How to make boost::exponential_distribution work?

本文关键字:distribution 工作 exponential boost 何使      更新时间:2023-10-16

我已经玩BoostRandom一天了,虽然boost::uniform_int_distribution<>运行良好,但boost::exponential_distribution<>有问题。

一个简单的程序胜过千言万语:

#include <iostream>
#include <boost/random/mersenne_twister.hpp>
#include <boost/random/exponential_distribution.hpp>
int main() {
  boost::mt19937 gen;
  boost::exponential_distribution<> dis;
  std::cout << dis(gen) << "n";
  return 0;
}

使用Clang 3.0编译,使用Boost 1.39.1(不,我无法升级Boost)。

输出始终相同:nan

我找不到任何报告的问题,所以我想是我没有正确使用库。。。任何线索都将不胜感激。

给定一个随机数r,均匀分布在[0,1)上,-log(r)分布在(0,无穷大)上,分布为exp(-x)。前者是boost::uniform_01()

如果您需要分发p exp(-px),那么它就是-(1/p)log(r)

在这两种情况下,这里log(x)都是自然对数(基本e)。

UPD:使用boost::variate_generator似乎对我有效(提升1.43):

#include <iostream>
#include<boost/random.hpp>
int main() {
  boost::mt19937 rng(11u); 
  boost::variate_generator< boost::mt19937&, boost::exponential_distribution<> > rndm(rng, boost::exponential_distribution<>()) ;
  std::cout<<rndm()<<"n";
}

不过我没有检查分配情况。