FrontPage  ページ一覧  検索  更新履歴  RSS  ログイン

Psychlops Wiki - Math Misc Tools 差分

  • 最後の更新で追加された部分はこのように表示します。
  • 最後の更新で削除された部分はこのように表示します。

! 定数

以下の定数はプログラム中で修飾なしに使用することができます。ただし、他ライブラリと併用する際に同名の定数ないしマクロが指定されている場合はご注意ください。

*const double PI = 3.14159265358979;

sin(2*PI);


! 関数

!! 乱数

擬似乱数生成器には[[Double precision SIMD-oriented Fast Mersenne Twister (dSFMT)|http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/SFMT/index-jp.html]]の周期2^(19937-1)バージョンを使用しております
{{fn('Mutsuo Saito and Makoto Matsumoto, "SIMD-oriented Fast Mersenne Twister: a 128-bit Pseudorandom Number Generator", Monte Carlo and Quasi-Monte Carlo Methods 2006, Springer, 2008, pp. 607 -- 622. DOI:10.1007/978-3-540-74496-2_36')}}{{fn('コンパイルの妥当性については、乱数の種をdSFMT-ref.cと同じ1234で初期化した後、以下のコードをdSFMT.19937.out.txtと比較してください。桁数以外が合致していれば正しく動いています。
void psychlops_main() {
randomize(1234);
double result[100];
for(int i=0; i<100; i++) result[i] = 1+random();
Data::savearray("out.txt", "", 100, result);
}
psychlopsはgenrand_close_open()を読むため、genrand_close1_open2()を使用したdSFMT-ref.cとあわせるために1を足しています。')}}。このアルゴリズムは[[MATLABで使用|http://www.mathworks.com/access/helpdesk/help/techdoc/index.html?/access/helpdesk/help/techdoc/ref/rand.html]]されている[[Mersenne Twister|http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/mt.html]]のアップグレード版です。

:double random():[0,1)に一様分布する乱数を返します。
:double random(double factor):[0,factor)に一様分布する乱数を返します。random()をfactor倍しているだけなので、下位数ビットの精度には注意が必要です。'''引数が実数(double)か整数(int)かで動作が異なりますので、実数を得たい場合は最大値が整数でも必ず1.0などのように小数点をつけて指定してください。整数変数を指定する場合は(double)でキャストしてください。'''

random(5)   ← [0,1,2,3,4] のいずれかの数がint型で返る
random(5.0) ← [0, 5)の間の浮動小数点値が返る

int i = 5;
random(i)         ← [0,1,2,3,4] のいずれかの数がint型で返る
random((double)i) ← [0, 5)の間の浮動小数点値が返る

:double random(double min, max):[mix,max)に一様分布する乱数を返します。random()を(max-min)倍してminを足しているだけなので、下位数ビットの精度には注意が必要です。
:int random(int levels):[0,levels)に一様分布する乱数の小数点以下を切り捨てたものを返します。例えば5水準の値を得たい場合、random(5)とすると[0,1,2,3,4]の5水準の値からランダムに返されます。

// 配列の添字に一様分布な離散的乱数の整数値を指定します
int array[10];
array(Psychlops::random(10))


!! その他

:double Math\:\:mod(double denominator, double numerator):剰余の計算を行います。

負の数を割ったときの剰余は多くの言語で未定義とされていますが、C++(%演算子やfmod関数)では負の数になります。また、C++の剰余演算子は整数型のみ定義されています。
Math:: modは剰余の計算を浮動小数点型に拡張するとともに、負の数を割ったときの挙動を周期関数的にしてあります。視覚実験では周期関数の位相を値とすることが多くありますが、この関数を使うと位相が負でも正でも一定の範囲の剰余が得られます。ifやswitchで値ごとに条件分岐している場合には特に役立ちます。

たとえば、-450を360で割った剰余をとる場合、

-90 == -450 % 360
270 == Math::mod(-450, 360)

%演算子では剰余が負の数になってしまいますが、Math::modを使うと正の数で得ることができます。両関数をグラフで描画すると下図のようになります。

[[http://psychlops.sourceforge.jp/images/ReferenceManual/Math.mod.png]]


:int Math\:\:round(double val):四捨五入した値を返します。