rnorm
標準正規分布の乱数を生成するために、デフォルトで関数によって使用されているアルゴリズムはどれですか?
2 に答える
を参照してください?RNGkind
。デフォルトは反転アルゴリズムです。
normal.kind
"Kinderman-Ramage"、"Buggy Kinderman-Ramage" (set.seed
以外)、"Ahrens-Dieter"、"Box-Muller"、"Inversion" (デフォルト)、または "user-supplied" を指定できます。(反転については、 のリファレンスを参照してくださいqnorm
。) 1.7.1 より前のバージョン (現在は "Buggy" と呼ばれています) で使用されていた Kinderman-Ramage ジェネレーターには、いくつかの近似エラーがあり、古い結果の再現にのみ使用する必要があります。「Box-Muller」ジェネレーターは、法線のペアが生成されて順番に返されるため、ステートフルです。状態は、選択されるたびに (現在のノーマル ジェネレーターであっても)、種類が変更されるとリセットされます。
でアルゴリズムを変更できます。
RNGkind(normal.kind = "Box-Muller")
を参照すると、現在設定されている内容を確認できますRNGkind()[2]
。
他の答えで十分ですが、さらにいくつかの質問がありました。特に、私はドキュメントのどこにも見ませんでした*アルゴリズムが一体何なのか、ソースコード"Inversion"
に飛び込みました. .
case INVERSION:
#define BIG 134217728 /* 2^27 */
/* unif_rand() alone is not of high enough precision */
u1 = unif_rand();
u1 = (int)(BIG*u1) + unif_rand();
return qnorm5(u1/BIG, 0.0, 1.0, 1, 0);
したがって、デフォルトの"Inversion"
アルゴリズムは高精度の浮動小数点数(53ビット、または64ビットの浮動小数点数の仮数サイズqnorm5
のように見えます)を生成し、それを正規分布のCDF関数である関数に送信するようです。
関数がどのように機能するかについて (通常の CDF にも逆 CDF にも閉じた形式がないことを考えると)、ここqnorm5
にあるソース コードと思われるものをクラックする幸運はあまりありませんでしたが、さらに学術的な参考文献、つまりBeasleyを提供しています。 JD と SG スプリンガー (1977 年)とウィチュラ、MJ (1988 年)。前者は通常、CDF の小さな分位数に使用され、後者は大きな (またはその程度の) ものに使用されます。z>7
また、(この記事の執筆時点で) このアルゴリズムは Julia 言語で共有されているqnorm5
ように見え、また で使用されるコードも共有していることに注意することも興味深いかもしれませんR
。
*公平を期すために、振り返ってみると、上記で参照されているウィチュラが言及され?qnorm
ています. それでも、このスレッドで詳しく説明する価値はあると思います。