【问题标题】:My Webworkers do not seem to be calculating correctly我的网络工作者似乎没有正确计算
【发布时间】:2014-01-14 13:32:11
【问题描述】:

我正在编写一个 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);

【问题讨论】:

    标签: javascript random geometry computer-science calculus


    【解决方案1】:

    这是因为大于 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)

    【讨论】:

    • 不知道为什么投反对票。答案中的观察确实解释了为什么 OP 获得 NaN 值(+1 以抵消反对票)。
    • @RobW 这是因为我在原始编辑中发布了错误的公式,我正在创建一个新的。另外,感谢+1 :)
    • 好吧,即使这是真的,那么反对者也可以添加评论来解释问题所在。这不需要一分钟,而且对每个人都有帮助:您将知道如何纠正您的答案,而对否决票感到困惑的未来读者将知道看似合理的答案有什么问题。
    • 不确定您从哪里获得 1/Math.acos。 OP 的公式说 cos^-1 就是 Math.acos (arccosine)。 Math.floor 也不正确。
    • @Arnavion 我编辑了我的帖子,只是我很困惑,因为当我第一次提出这个问题时,有人否决了我的答案......我以为我的数学错了。好吧,我想既然他不能取消投票,我只需要等待人们投票 ;)
    【解决方案2】:

    你有一个额外的乘法。

    var phi = Math.acos(2 * (Math.random()) * - 1);
    

    应该是

    var phi = Math.acos(2 * Math.random() - 1);
    

    【讨论】:

      猜你喜欢
      • 2018-11-26
      • 1970-01-01
      • 2020-05-03
      • 1970-01-01
      • 1970-01-01
      • 2017-09-08
      • 1970-01-01
      • 2021-05-28
      相关资源
      最近更新 更多