Шучу конечно
Это же статья -перевод. Не стоит воспринимать ее буквально, возможно та часть которая Вам не понравилась переведена неточно. А конкретно по поводу алгоритма — примитив конечно, но большинство типичных программистов решают большую часть времени именно такие задачи, эта ещё не самая худшая
А что Вам не понравилось?
Универсальный метод решения задач:
1 сформулируй условия задачи
2 поищи, возможна она уже решена, если да то используй готовое решение
3 если нет готового решения включи мозг напиши минимальное решение
4 если нет решения заплати тому кто может решить
5 если нет решения брось эту задачу, попробуй вернуться к первому пункту попозже или возьми другую задачу.
Чем не универсальный метод? Первые три пункта описаны в статье
4 «мне пора учить людей как писать статьи»
Напишите лучше.
Вполне себе рабочий алгоритм. Правда задачу быстрее решить по другому. Сначала построить конвекс ( это О(n) на плоскости ) для всех вершин каждого объекта и проверить пересекаются ли с конвексами других объектов а потом проверять по треугольникам
Тут вообще много пропущено. Что такое функции new и delete и как они работают. Объяснять простые понятия основываясь на более сложных наверное не самый оптимальный подход.
лучший Mersenne Twister генератор который я видел :). А вообще спасибо, посмотрю обязательно. Мне скорость и качество очень критичны(RANSAC like code).
Больше 2 в одном потоке выигрыша по скорости скорее всего не дадут.
А зачем Вам 10? Первый рандом инит из time остальные из первого:
FRand fr(time_count());
FRand fr1(fr.rand());
FRand fr2(fr.rand());
Вот именно для отсутствия коллизий и нужно Ваши статические переменные переложить в members, как в моем примере. Компилятор использует больше регистров и уменьшает latency. посмотрите разницу между 2 и 3 примером по скорости
rand() — отвратная и древняя функция,static thread_local — не нужно, нужны именно переменные члены класса или структуры. Еще раз, статические переменные затрудняют работу оптимизатора если Вы используете более одного экземпляра класса даже в одном потоке.
Автору
Вообще — типичный код для математика: отличная алгоритмическая работа и значительно более слабая (хотя и неплохая) реализация. Фунцию Variate поправьте обязательно, однозначно будет проблема со скоростью (конфликт read-modify-write на общей памяти)
Кроме того, статические переменные затрудняют работу оптимизатора если Вы используете более одного экземпляра класса
1
«RandLib избавляет пользователя от двух вещей: выбора базового генератора (функции, возвращающей целое число от 0 до некого RAND_MAX) и выбора стартовой позиции для случайной последовательности (функция srand()). Сделано это во имя удобства, так как многим пользователям этот выбор скорее всего ни к чему.»
— Не согласен.Для отладки очень часто нужна именно повторяемость.
2
Могут быть проблемы со статическими переменными в функциях BasicRandGenerator<..>::Variate() в многопоточной среде, лучше сделать их членами класса.
Это же статья -перевод. Не стоит воспринимать ее буквально, возможно та часть которая Вам не понравилась переведена неточно. А конкретно по поводу алгоритма — примитив конечно, но большинство типичных программистов решают большую часть времени именно такие задачи, эта ещё не самая худшая
Универсальный метод решения задач:
1 сформулируй условия задачи
2 поищи, возможна она уже решена, если да то используй готовое решение
3 если нет готового решения включи мозг напиши минимальное решение
4 если нет решения заплати тому кто может решить
5 если нет решения брось эту задачу, попробуй вернуться к первому пункту попозже или возьми другую задачу.
Чем не универсальный метод? Первые три пункта описаны в статье
Напишите лучше.
Вполне себе рабочий алгоритм. Правда задачу быстрее решить по другому. Сначала построить конвекс ( это О(n) на плоскости ) для всех вершин каждого объекта и проверить пересекаются ли с конвексами других объектов а потом проверять по треугольникам
стек — это патроны в магазине автомата. Последний вставленный выходит первым.
1.1 ns (rnd32) бит на том же тесте и моей платформе: habrahabr.ru/post/323158/#comment_10503460
А зачем Вам 10? Первый рандом инит из time остальные из первого:
FRand fr(time_count());
FRand fr1(fr.rand());
FRand fr2(fr.rand());
Инициализируйте разными seed из того же time
//log
gen 351.955 ms
0.499969
gen 347.921 ms
0.500026
gen 272.77 ms
0.499971
Собственно оболочка:
* brief Tiny Mersenne Twister only 127 bit internal state
*
* author Mutsuo Saito (Hiroshima University)
* author Makoto Matsumoto (University of Tokyo)
github.com/MersenneTwister-Lab/TinyMT
На моей машине дает (3.2 GHz ) 2.7 ns per uniform number и это лучший генератор который я видел
Вообще — типичный код для математика: отличная алгоритмическая работа и значительно более слабая (хотя и неплохая) реализация. Фунцию Variate поправьте обязательно, однозначно будет проблема со скоростью (конфликт read-modify-write на общей памяти)
Кроме того, статические переменные затрудняют работу оптимизатора если Вы используете более одного экземпляра класса
«RandLib избавляет пользователя от двух вещей: выбора базового генератора (функции, возвращающей целое число от 0 до некого RAND_MAX) и выбора стартовой позиции для случайной последовательности (функция srand()). Сделано это во имя удобства, так как многим пользователям этот выбор скорее всего ни к чему.»
— Не согласен.Для отладки очень часто нужна именно повторяемость.
2
Могут быть проблемы со статическими переменными в функциях BasicRandGenerator<..>::Variate() в многопоточной среде, лучше сделать их членами класса.