正規分布を持つ配列に数値を生成したいと思います。数学なしで簡単に結果を得るのに役立つ関数がobjective-cまたはcにありますか?
2 に答える
Box-Muller-Transformationを使用します。
1.)区間(0,1](0は除外する必要があります)のdoubleとして2つの均一に分散された乱数uとvが必要です。
double u =(double)(random() %100000 + 1)/100000; //for precision
double v =(double)(random() %100000 + 1)/100000; //for precision
2.)平均が0で標準偏差のシグマが1の均一分布値を計算します。
double x = sqrt(-2*log(u))*cos(2*pi*v); //or sin(2*pi*v)
3.)必要に応じて、次のようにターゲット分布のシグマと平均を追加します。
double y = x * sigmaValue + averageValue;
4.)それを配列に入れます
[randomNumberArray addObject:[NSNumber numberWithDouble:y]]
norminv
objcの関数はありません。したがって、ここでは数学が必要です。
編集:random()
ランダム値ジェネレーターをシードできるようにするために使用するのが好きです
私が間違っている場合は、私を訂正してください!
Box-Muller 変換は、ソース番号自体が均一に分散されていることに依存しているため、ボックス ミュラーのソース データセットとして random() または rand() を使用しても、必ずしも均一な分布が生成されるとは限りません。
代わりに、均一に分散された乱数の一般的なセットを取得し、2D 座標系に均一に分散された乱数の独立したペアを生成することを目的としています。
ただし、別の方法があります。
関数のrand48ライブラリを使用するほとんどの Unix システム (したがって、iOS または OSX の Objective C ) では:
double drand48(void);
void srand48(long int seedval);
srand48() はジェネレーターをシードし、drand48() は [0.0 - 1.0] の間隔で均一に分散された乱数を生成します。