我一直在玩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
。
我找不到任何报道的问题,所以我想这是我没有正确使用该库...任何线索都将不胜感激。
答案 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";
}
我没有检查分发。