Войти
ПрограммированиеФорумОбщее

Как получить случайное направление? (8 стр)

Страницы: 13 4 5 6 7 8
#105
1:51, 10 сен. 2016

Executor
> По ссылке что я кинул, проще же. Нет?
Вопрос размерности. Одномерный случай вообще требует просто сравнения. Окружность обрабатывается через случайный угол. Сфера уже через частный случай, а дальше только через общий с нормальным распределением. Сегодня сферу точками заполняют, а завтра начнут многомерные векторы отыскивать, вот пусть и лежит про запас.


#106
4:53, 10 сен. 2016

Просто оставлю это здесь...

#include <math.h>
#include <iostream>
using namespace std;

class Vec3d
{
public:
    double x, y, z;

public:
    Vec3d() {};
    Vec3d(double a, double b, double c) : x(a), y(b), z(c) {}
};

double randf()
{
    return ((double)rand()/(double)(RAND_MAX));
}

Vec3d vRand()
{
    double theta = 2.0 * M_PI * randf();
    double phi = acos(2.0 * randf() - 1.0);
    double sinphi = sin(phi);
    return Vec3d(cos(theta) * sinphi, sin(theta) * sinphi, cos(phi));
}

int main() 
{
  
  Vec3d v = vRand();

  printf("x = %f\n", v.x);
  printf("y = %f\n", v.y);
  printf("z = %f\n", v.z);
  
  return 0;
}
Output:
x = 0.524709
y = -0.824658
z = -0.211234
https://ideone.com/vbEjUw
#107
10:24, 10 сен. 2016

Hybernaculum
Зачем?
Очевидное и бесполезное решение, хуже, чем нормализация куба.

#108
11:08, 10 сен. 2016

-Eugene-
> Очевидное и бесполезное решение
Чукча не читатель кода?

> хуже, чем нормализация куба.
Нет, это отличное решение с равномерным распределением по поверхности сферы, что намного лучше нормализации куба.
Изображение

#109
11:20, 10 сен. 2016

С точки зрения практики самоё простое решение я дал сразу:
Mikle
> Можно генерировать случайный вектор в пределах куба, если длина окажется больше 1, генерировать повторно, результат нормализовать.
Единственная трансцендентная ф-ция (кв. корень при нормализации) выполняется только один раз уже ПОСЛЕ проверки длины, то есть при повторной генерации не вызывается лишний раз.

#110
11:32, 10 сен. 2016

Hybernaculum
> Чукча не читатель кода?
Да, я его почти не читал. Пора отучаться от этой дурной привычки.
Там вся суть ведь в арккосинусе..

#111
13:03, 10 сен. 2016

Hybernaculum
> Просто оставлю это здесь...

+
Это в принципе как раз то, что я кинул ранее.

#112
20:43, 10 сен. 2016

-Eugene-
> Там вся суть ведь в арккосинусе..
+1

Hybernaculum
Людям, не умеющим считать sin/cos от арккосинуса, не стоит заниматься сложной математикой

Mikle
> С точки зрения практики самоё простое решение я дал сразу
Там еще вопрос, что проще, лишние бранчи или однократный расчет тяжелой функции.
Особенно, если учесть, что отношение объемов сферы и куба быстро падает с увеличением размерности:

+ вероятности успеха с одного раза

Т. е. для трехмерного случая всего 52%, для четырехмерного, вообще, 31%.
Это особенно плохо, если учесть, что вызов генератора случайных чисел тоже не бесплатный.
А еще есть векторные архитектуры (SSE/AVX и GPU), в которых стоимость бранчей высокая.
#113
9:22, 11 сен. 2016

А в каком контексте задача?
Может было бы достаточно выбирать готовые значения откуда-то? (из картинки, например)

#114
10:24, 11 сен. 2016

haper
> А в каком контексте задача?
Ты на даты посмотри..

#115
11:46, 11 сен. 2016

-Eugene-
> Ты на даты посмотри..
Ну некрофильство ж не я начал:)

Страницы: 13 4 5 6 7 8
ПрограммированиеФорумОбщее

Тема в архиве.