Boost
Boost とはC++ のためのオープンソースライブラリのことで、
いろいろと便利なライブラリを含んでいます。
例えば、乱数発生だとか、特殊関数の計算だとかができます。
ただ、使い方がちょっと分かりにくいので、
備忘録としてメモを書いておきます。
なお、Ubuntu のバージョンは 10.04LTSです。
注意:
あくまで個人的な備忘録ですので、
Boostライブラリについての理解や使い方について、
これで正しいと保証するものではありません。
この記事を元に何かをした結果、
何らかの損害が発生したとしても、
当方は一切の責任を負いません。
実行は自己責任でお願いします。
参考サイト
インストール
まず C++ のコンパイラ g++ は標準ではインストールされていないので、
sudo apt-get install g++
でインストールしておきます。そして、boost を
sudo apt-get install libboost-dev
でインストールします。
/usr/include/boost 以下にライブラリがインストールされます。
乱数発生
シミュレーションなどでは、浮動小数点(実数)の乱数が必要になることが
多いと思います。以下は、Mersenne Twister という方法で
[0,1] の一様乱数を得るサンプルプログラムです。
#include <boost/random.hpp> //乱数発生用ヘッダファイル
#include <iostream> //確認の出力用
#include <ctime> //乱数の種に time を使う場合に必要
double UniformRandom() //一様乱数を発生させる関数
{
static boost::mt19937 gen( static_cast<unsigned int>(time(0)) );
static boost::uniform_real<> dst(0,1);
static boost::variate_generator< boost::mt19937&, boost::uniform_real<> > rand(gen, dst);
return rand();
}
int main()
{
for(int i=0; i<10; ++i)
std::cout << UniformRandom() << std::endl;
}
上の内容をrandom.cpp というファイルに保存して、
コンパイル
g++ random.cpp
して実行
./a.out
すると[0,1]乱数が10個出力されるはずです。
説明
関数 UniformRandom() 内の記述について、説明します。
- static boost::mt19937 の行:
まずは乱数発生をどのアルゴリズムでやるかを選択しないといけませんが、
この行は Mersenne Twister の 19937 アルゴリズムを選択しています。
また種は、時間で変化するようにしています。
ここに入れるものは負だと具合が悪いそうですので、
unsigned にキャストしています。
また、関数を呼び出すたびに種が変わると、
一度呼び出して次に呼び出すタイミングが速いと
time で同じ種を使ってしまうので、static 型にしています。
- static boost::uniform_realの行:
一様乱数を使うことを選択します。
dstの名前は適当でいいようです。
dst の二つの引数は[0,1]を表します。
- static boost::variate_generatorの行:
rand の名前は適当でいいようです。
一様乱数を発生させます。
- returnの行:
発生させた一様乱数の値を返します。
main 関数側では、UniformRandom() を呼び出すだけです。
その他
- uniform_real (2箇所)のところを uniform_int にすると整数型の乱数が出ます。
また normal_distribution にすると正規分布に従う乱数が出ます。
この場合、dst の2引数は順に平均と標準偏差です。
- 乱数の種として同じものを使うと、同じ乱数列が出ます。
再現性を確保したいなどの理由で種として time を使いたくない場合は、
単に time(0)のところに int型整数を入れれば OK です。
入れる整数の値によって乱数列が変わります。
特殊関数(第1種変形ベッセル関数)
例として、第1種変形ベッセル関数の値を得る方法です。
#include <boost/math/special_functions/bessel.hpp> // ベッセル関数関係のヘッダファイル
#include <iostream> //確認の出力用
int main()
{
std::cout << boost::math::cyl_bessel_i(0,0.5) << std::endl;
}
cyl_bessel_i というのが第1種変形ベッセル関数の値を返す関数で、
名前空間 boost::math にあるようです。
cyl_bessel_i の引数は、第1引数が第1種変形ベッセル関数の次数(実数)で、
第2引数が計算したい点(複素数)です。
第2引数は複素数と書いていますが、複素数で試したことはないので
正しい値が得られるかはわかりません。
他にもいろんな特殊関数が用意されています。
Last modified: Tue Apr 9 11:45:54 JST 2013