ボックスミューラーのプログラム
ボックスミューラーのプログラムです。
アルゴリズムは下記の記事です。
平均、分散、個数を入力し、
発生させ、標準出力するようにしています。
ボックスミューラーで標準正規分布を作成し、線形変換より、
指定した平均と分散になるようにしています。
出力値のヒストグラムを作れば、妥当性をチェックできると思います。
C/C++で書いてます。
本当であれば、ポインタを返すようにすれば良いですが・・・。
#include <iostream> #include <cstdlib> #include <cmath> using namespace std; const int pi = 3.141592; void boxmuller (double mu,double sigma,int imax) { double num1,num2,x1,x2,z1,z2; for (int i = 0; i < imax; i++){ // 0~1の一様乱数生成 num1 = (double)rand()/(double)RAND_MAX; num2 = (double)rand()/(double)RAND_MAX; // ボックスミュラー法 x1 = sqrt(-2.0*log(num1))*cos(2*pi*num2); x2 = sqrt(-2.0*log(num1))*sin(2*pi*num2); // 線形変換 z1 = mu + sigma*x1; z2 = mu + sigma*x2; cout << z1 << "," << z2 << endl; } } int main(void) { // ボックスミューラー法による正規分布の作成 // 平均値、分散、個数 boxmuller(0,1,1000); }
Perlのサブルーチン
Perlのリファレンス渡しについてです。
Perl入学式2013の第4回資料の一部を元に考えました。
https://github.com/perl-entrance-org/workshop-2013-04/blob/master/slide.md
例題として、ベクトルの内積を求めるサブルーチンを考えます。
ポイントは、サブルーチンに配列を渡すとき、
- 配列をそのまま引数で渡すと、中身が展開されてしまう。
- 展開されないようにするために、リファレンスで渡す。
のように理解しました。
まあ、合っているかどうかわかりませんが・・・。
Perl入学式の第4回では、ここら辺を確認したいと思います。
use strict; use warnings; my @a = qw/ 1 2 /; my @b = qw/ 2 3 /; # 内積 sub dot { my ($v1, $v2) = @_; my $result = 0 ; # ベクトルの次元は2 for my $i (0..1) { $result += @$v1[$i]*@$v2[$i]; } return $result; } # 各配列を区別したい場合はリファレンス渡しにする my $out = dot(\@a, \@b); print "$out"."\n";
Perlのサブルーチン
Perlのサブルーチンのメモです。
引数は「@_」に入るので、サブルーチンの中で、引数の受け渡しが必要です。
もちろん省略は可能のようです。
サブルーチンは以下の形がひな形のようです。
sub サブルーチン名 { #処理の記述 }
ちょっとまだよくわかってませんが、そのうちPerl入学式第4回を受講すれば、
ある程度整理されるかと思います。(ちょっとした予習です)
#!/usr/bin/env perl use strict; use warnings; #足し算のサブルーチン sub add { # 引数は「@_」 my @nums = @_; print "@nums\n"; my $sum = 0.0; # 引数の個数分足し合わせる for my $num (@nums){ $sum += $num; } print "合計=$sum\n"; } # サブルーチン呼び出し add(1,2,3,4,5,6,7,8,9,10);
Perlの読みたい本は、以下です。
読んで理解したら、ようやくヒヨッコかなと思います。
- 作者: Randal L. Schwartz,brian d foy,Tom Phoenix,近藤嘉雪
- 出版社/メーカー: オライリージャパン
- 発売日: 2012/07/25
- メディア: 大型本
- 購入: 7人 クリック: 22回
- この商品を含むブログ (16件) を見る
- 作者: ラリーウォール,ジョンオーワント,トムクリスチャンセン,Larry Wall,Jon Orwant,Tom Christiansen,近藤嘉雪
- 出版社/メーカー: オライリー・ジャパン
- 発売日: 2002/09
- メディア: 単行本
- 購入: 8人 クリック: 245回
- この商品を含むブログ (130件) を見る
- 作者: 牧大輔
- 出版社/メーカー: 翔泳社
- 発売日: 2009/02/10
- メディア: 大型本
- 購入: 25人 クリック: 534回
- この商品を含むブログ (113件) を見る
Fortran
Fortranの本です。
出てすぐ買いました。
当時、Windowsでのf90のインストールおよびその使い方がわからなくて、
むさぼるように読みました。
本書籍では、G95が使われていますが、今はバギーですね。
今は、商用をのぞけばgfortran一択です。
この本で良いところは、数値計算でのプログラムの書き方について、言及しているところです。
それまでの私が読んできた本は、「文法はこれこれです」「サンプルプログラムはこれです」が多かったので、
が書いてあって、独学できる本です。
一方、構造体については記述されていないので、別途、リファレンスを読む必要があります。
紹介でした。
- 作者: 牛島省
- 出版社/メーカー: 森北出版
- 発売日: 2007/07/18
- メディア: 単行本(ソフトカバー)
- 購入: 3人 クリック: 17回
- この商品を含むブログ (5件) を見る
ボックスミュラーのアルゴリズム
仕事で、乱数生成が必要になったので、アルゴリズムだけ備忘録を残します。
pythonであれば、numpyを使うのですが、業務によってはライブラリを使わない場合もあります。
参考にしたのは、下記の文献です。
- 作者: 東京大学教養学部統計学教室
- 出版社/メーカー: 東京大学出版会
- 発売日: 1992/08
- メディア: 単行本
- 購入: 26人 クリック: 308回
- この商品を含むブログ (21件) を見る
このシリーズは3冊あるようで、3冊とも購入しました。
最近の書籍には珍しく?数式だったり証明が記述されており、
中身は充実してると思います。初版から20年以上たっていますが、
いまだに売れているということからも、この本の評価がわかると思います。
(もしかしたら、大学の教科書として使われていることが多いのかもしれませんが)
ちなみに、「人文・社会科学の統計学」については、経済学における統計学の使われ方も多少記述されており、
「ほうほう」と思わせてくれるものもありました。
- 作者: 東京大学教養学部統計学教室
- 出版社/メーカー: 東京大学出版会
- 発売日: 1994/07
- メディア: 単行本
- 購入: 4人 クリック: 32回
- この商品を含むブログ (14件) を見る
以下、アルゴリズムです。
プログラムを書く場合は、一様乱数を呼び出せば、どの言語でもいけると思います。
一様乱数U1、U2から
により得られるX_1とX_2は互いに独立に標準正規分布N(0,1)に従う。
ちなみには自然対数である。
一般の正規分布に従うZの場合は、
上記のXに対して、下記の線形変換で求める。
Perlメモ
スクリプトを置いた箇所のファイル一覧を出すプログラムです。
下記の書籍を大いに使っております。
もっと自在にサーバを使い倒す 業務に役立つPerl (Software Design plus)
- 作者: 木本裕紀
- 出版社/メーカー: 技術評論社
- 発売日: 2012/04/11
- メディア: 単行本(ソフトカバー)
- 購入: 3人 クリック: 94回
- この商品を含むブログ (13件) を見る
書籍の良い点を上げておきます。
- 薄いこと(良くまとまっており、持ち運びに便利)
- プログラムの一行一行に解説があること。
- お作法についてちゃんと記述されていること。
- リファレンスについて記述されていること。
- オブジェクト指向について多少記述されていること。
加えて下記の本は、やさしさが溢れております。
リファレンスについては触れられておりませんが、
ちょっとしたテキスト処理なら、できるようになると思います。
- 作者: 結城浩
- 出版社/メーカー: ソフトバンククリエイティブ
- 発売日: 2006/10/21
- メディア: 単行本
- 購入: 16人 クリック: 235回
- この商品を含むブログ (86件) を見る
use strict; use warnings; use Data::Dumper; # ディレクトリの取得 my $dir = "./"; # ディレクトリハンドルをオープン opendir my $dh, $dir or die qq/Can't/; #「.」、「..」以外のファイルを取得 my $files = []; while ( my $file = readdir $dh) { next if $file eq '.' || $file eq '..'; push $files, $file; } print Dumper $files; print "@$files"."\n"; closedir $dh;