转载自:http://sobereva.com/311


参考算法网址(未看,待研究):http://mathworld.wolfram.com/SpherePointPicking.html

Marsaglia方法:在[0,1)区间内随机取两个值x1和x2,若这两个值的平方和大于等于1则重新选取。

                        球面上的点的x、y、z的坐标用x1和x2计算得到。

Fortran代码如下:
do while(.true.)
    call RANDOM_NUMBER(x1)
    call RANDOM_NUMBER(x2)
    x1=2*(x1-0.5D0)
    x2=2*(x2-0.5D0)
    if (x1**2+x2**2<1) exit
end do
x=2*x1*dsqrt(1-x1**2-x2**2)   //算法应该就是这两行
y=2*x2*dsqrt(1-x1**2-x2**2)   //
z=1-2*(x1**2+x2**2


随机,不一定均匀

前面加上call RANDOM_SEED(),只有call RANDOM_NUMBER(),生成随机数相同

fortran的随机数(待学习)