空間内の1点から一様に放射する線の生成,あるいは(単位)球面上に一様に分布する乱数点の生成

球体外の点を棄却した後,正規化する(球面上に射影する)方法

  • 1<=x<1, -1<=y<1, -1<=z<1の立方体内に一様に分布する乱数点の生成は非常に簡単.
x = 2 * rand() - 1;
y = 2 * rand() - 1;
z = 2 * rand() - 1;

これだけ.次にこのうち原点が中心で半径が1の単位球面を考えて,
この単位球の外に生成される点を捨てる.

do{
  x = 2 * rand() - 1;
  y = 2 * rand() - 1;
  z = 2 * rand() - 1;
}while(sqrt(x * x + y * y + z * z) > 1)

これによって単位球体内に一様に分布する乱数点を生成できる.
後は,この単位球体内に生成された点を対応する球面上に射影すればOK.

length = sqrt(x * x + y * y + z * z);
x /= length;
y /= length;
z /= length;

おそらくもっとも直感的で簡潔な方法.
一様乱数の変換方法の1つである『棄却法 (rejection method)』と言って良いんだろうけれど,
3次元での棄却法なので直感的にピンと来なかったり.

幾何学的考察に基づく方法 or 変換法に基づく方法

「球面上に一様に分布する」という表現をきちんとした数学の言葉で定義しなおす.でないと,数学的に扱えない.
以下,原点を中心とする単位球面で議論する.後,空間極座標を使う.
「球面上に一様に分布する」というのを「球面上のある座標(θ, φ)における微小面素tex:d\thetad\phiにおける
点の生成確率がtex:\theta\phi/4\piである」という形で表すことにする.すると,

ハミルトンの4元数に基づく方法

直行した3つの標準正規分布の合成