Мне нужно пояснение по поводу алгоритма, генерирующего случайные значения для моего любимого трассировщика лучей.
Я испускаю лучи из одной точки. И у меня проблема с распределением этих лучей: мне нужно, чтобы распределение было равномерным, но это не ...
Проблема, с которой я столкнулся сейчас, заключается в том, что изначально однородное распределение не является однородным после того, как я исказил пространство результатов.
Так, например, я генерирую углы r и t в полярной системе координат. Распределение неоднородно и не может быть однородным: пространство вблизи каждого полюса имеет гораздо большую плотность результатов, чем, скажем, вблизи экватора. Причина довольно ясна: я конвертирую равномерно распределенные точки из цилиндрического пространства в сферическое. И искажаю результаты. Та же проблема возникает, если я нормализую точки, случайно сгенерированные в кубе.
Моя идея сейчас такова: я хочу создать тетраэдр, нормализовать его вершины, разделить каждую грань (треугольник) точкой посередине, нормализовать ее и повторять рекурсивно, пока у меня не будет достаточно точек. Потом немного "передергиваю" эти точки. Потом снова нормализую их. Вот и все.
Я понимаю, что этот метод не является чисто математическим методом Монте-Карло, потому что я не использую случайное распределение ни на одном этапе, кроме последнего. И мне не нравится это решение из-за такой сложности.
Может ли кто-нибудь предложить что-нибудь более простое, но все же
- случайный
- униформа
- быстрый
- просто
Спасибо!
РЕДАКТИРОВАТЬ:
Мне нужен быстрый метод, а не только правильный. Вот почему я спрашиваю о Монте-Карло. Предоставленные ответы верны, но не быстро. Метод с тетраэдром быстрый, но не очень "случайный" => некорректный.
Мне действительно нужно что-то более подходящее.