倭マン's BLOG

くだらない日々の日記書いてます。 たまにプログラミング関連の記事書いてます。 書いてます。

Java で球面上・球体内の一様分布を生成する (1):概要と準備

前回、「一般次元の球体内・球面上の一様分布」を計算する公式を考えましたが、それを実際に Java で実装してみましょう。 今回は準備のみ(一覧)。

クラスとしては PolarRandomGenerator というのを作成し、その public メソッドとして

  • setPointOnSphere(double[]):(n-1) 次元球面上に一様分布する点の座標を引数の配列にセットする
  • setPointInBall(double[]):n 次元球面上に一様分布する点の座標を引数の配列にセットする

を作成します。 メソッドの詳しい説明は次回以降に。

PolarRandomGenerator クラスの

は下記のコードのようなっているとします。 次回以降のサンプルコードでは「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π) 内の一様分布

を返します。