在光线跟踪算法里,有一个子问题:如何在一个半径为1的单位球里面,产生一个均匀分布的随机的点(相同的体积里有相同数量的点)。下面这篇文章里给出了5种可能的方法 (参考文献[3])。当然,后面我们会看到,这5种方法并不都是对的。
方法一:拒绝掉不在球里的点
这个方法是这样,首先我们在x,y,z分别在 [-1, 1] 里均匀采样,这样就能实现在一个立方体里均匀采样。但这样的点可能不在球里,我们把不在球里的点拒绝掉就行。
function getPoint() { var d, x, y, z; do { x = Math.random() * 2.0 - 1.0; y = Math.random() * 2.0 - 1.0; z = Math.random() * 2.0 - 1.0; d = x*x + y*y + z*z; } while(d > 1.0); return {x: x, y: y, z: z};}
这里,Math.random() 会产生一个[0,1]之间的均匀分布的随机数。