Мои веб-работники, похоже, не правильно рассчитывают

Я пишу приложение JavaScript для генерации случайных точек на поверхности сферы. Я нашел эту формулу на Вольфраме, чтобы получить фи и тета ( http://mathworld.wolfram.com/SpherePointPicking.html). У меня проблемы с Phi phi = cos^(-1)(2v-1) где v - случайные величины (0,1). Ниже приведен код JavaScript, который я написал для вычисления фи. Однако, когда он выполняется, он очень часто возвращает NaN. Может кто-нибудь сказать мне, если я неправильно понимаю формулу? Единственное, о чем я могу думать, это то, что Math.random() генерирует (0,1) и 0 может выдать ошибку. Но при запуске нескольких тестов я не думаю, что Math.random() генерирует 0 каждый раз, когда я выполняю строку.

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

2 ответа

Решение

Это потому, что арккосинус числа больше 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)

У вас есть дополнительное умножение.

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

должно быть

var phi = Math.acos(2 * Math.random() - 1);
Другие вопросы по тегам