我正在编写一个JavaScript应用程序来生成球体表面上的随机点。我在Wolfram上找到了这个公式来获得phi和theta(http://mathworld.wolfram.com/SpherePointPicking.html#eqn2)。 Phi是我遇到phi = cos^(-1)(2v-1)
问题的人,其中v是(0,1)的随机变量。以下是我编写的用于计算phi的JavaScript。但是,当它执行时,它经常返回NaN。任何人都可以告诉我,如果我误解了公式吗?我唯一能想到的是Math.random()生成(0,1)并且0可以抛出错误。但是在运行多个测试时,我不认为Math.random()
每次都生成0执行该行。
var phi = Math.acos(2 * (Math.random()) * - 1);
答案 0 :(得分:3)
这是因为数字大于1的反余弦(Math.acos()
函数)返回NaN
,而Math.random() * 2
有时返回大于1的数字。
如何解决?
我看到数学cos^(-1)(2v-1)
就像
一样v = someValue;
Math.acos(2 * v) - 1;
要想做到这一点,你可能想要
phi = Math.acos(2 * Math.random() - 1);
作为您的Javascript代码。
结论:
要修复,您需要做的就是替换
phi = Math.acos(2 * Math.random() * - 1);
与
phi = Math.acos(2 * Math.random() - 1);
(删除* -1)
答案 1 :(得分:0)
你有一个额外的乘法。
var phi = Math.acos(2 * (Math.random()) * - 1);
应该是
var phi = Math.acos(2 * Math.random() - 1);