如何使boost :: exponential_distribution有效?

时间:2012-01-30 08:08:42

标签: c++ boost random

我一直在玩Boost.Random一天,虽然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;
}

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

输出总是相同的:nan

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

1 个答案:

答案 0 :(得分:1)

给定随机数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";
}

我没有检查分发。