球体外の点を棄却した後,正規化する(球面上に射影する)方法
- 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である」という形で表すことにする.すると,