Пахнет как математическая XY задача , но сначала я сосредоточусь на вашем вопросе о ускорении цикла. Я все еще буду делать математику, хотя.
Таким образом, базовое ускорение может использовать рано continue
, если любой из x
или y
больше или равен 1.0
. Нет никаких шансов, что x*x + y*y < 1.0
когда один из x
или y
больше 1
.
do {
float x = customRand();
if (x >= 1.0) {
continue;
}
float y = customRand();
if (y >= 1.0) {
continue;
}
distance = x * x + y * y; // euclidean square distance
} while (distance >= 1.0);
К сожалению, он, скорее всего, испортит современный механизм прогнозирования ветвлений процессоров и все же может не дать большого ускорения. Контрольные показатели, как всегда, потребуются.
Кроме того, поскольку самый быстрый код - это тот, который не запускается, давайте обсудим потенциальную проблему XY. Кажется, вы генерируете точку, ограниченную кругом с радиусом 1.0
. В декартовой системе это сложная задача, но она очень проста в полярной системе, где каждая точка на диске описывается с радиусом и углом и может быть легко преобразована в декартову. Я не знаю, какое распределение вы ожидаете по области диска, но посмотрите ответы на эту проблему здесь: Создание случайной точки внутри круга (равномерно)
PS. Есть некоторые действительные комментарии по поводу <random>
, что как std
библиотека может также привести к некоторому ускорению.