前回、「一般次元の球体内・球面上の一様分布」を計算する公式を考えましたが、それを実際に Java で実装してみましょう。 今回は準備のみ(一覧)。
クラスとしては PolarRandomGenerator というのを作成し、その public メソッドとして
- setPointOnSphere(double[]):(n-1) 次元球面上に一様分布する点の座標を引数の配列にセットする
- setPointInBall(double[]):n 次元球面上に一様分布する点の座標を引数の配列にセットする
を作成します。 メソッドの詳しい説明は次回以降に。
PolarRandomGenerator クラスの
- import 文
- クラス宣言
- コンストラクタ
- フィールド
は下記のコードのようなっているとします。 次回以降のサンプルコードでは「import 文」や「nextXxxx() メソッド」を省略している場合がありますがあしからず:
import java.util.Random; import static java.lang.Math.*; class PolarRandomGenerator{ private final Random random; public PolarRandomGenerator(Random random){ this.random = random; } private double nextDouble(){ return this.random.nextDouble(); } private double nextPhi(){ return 2.0 * PI * this.random.nextDouble(); } /** * @param x n 次元球体 (n >= 2) 内において、 * 一様分布するランダムな点の n 次元座標をセットする配列 */ public void setPointInBall(double[] x){...} /** * @param x (n-1) 次元球面 (n >= 2)上において、 * 一様分布するランダムな点の n 次元座標をセットする配列 */ public void setPointOnSphere(double[] x){...} }
注意:
- nextDouble() メソッドは区間 [0, 1] 内の一様分布
- nextPhi() メソッドは区間 [0, 2π) 内の一様分布
を返します。