转载自:http://sobereva.com/311
参考算法网址(未看,待研究):
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的随机数(待学习)