Целью этого является то, что верхняя часть операторов if не является предпочтительной в нижней части. Я попытался присвоить значения enum каждому случаю. Затем выберите случайное целое число от 0 до размера std::list myList
, содержащего эти элементы перечисления. Значение перечисления найдено с использованием it = std::next (myList, r)
. Затем, если оператор if, соответствующий этому значению перечисления, равен false
, затем myList.erase (it)
и повторите процесс с помощью нового уменьшения myList
. Он работает, и все кажется хорошо рандомизированным. Но это неутешительно намного медленнее, чем когда я использовал оригинальные заявления if-else
. Любые предложения для более быстрого метода?
Вот фрагмент моего кода. Есть толпа девушек. Каждый парень выберет девушку, а затем выберет направление для танца с выбранной девушкой. Но не все направленные стороны возможны, если кто-то стоит на том месте, где он хочет встать, чтобы получить желаемое направление. Без рандомизации заявлений if-else
большинство ребят окажутся в том же направлении, что мне не нравится.Рандомизация порядка if ... else. Какой самый эффективный способ?
std::list<FacingDirection> guyFacingDirections = {Positive_x, Negative_x, Positive_y, Negative_y, Positive_xPositive_y, Positive_xNegative_y, Negative_xPositive_y, Negative_xNegative_y};
while (true) {
const int r = rand() % guyFacingDirections.size();
std::list<FacingDirection>::iterator it = std::next(guyFacingDirections.begin(), r);
const FacingDirection facingDirectionChoice = *it;
if (facingDirectionChoice == Positive_x) // I decided that using switch (facingDirectionChoice) {case Positive_x: if (... was too clumsy in code and probably no more efficient.
{
if (mainArea.locationAvailable (xChoice - 1, yChoice, zChoice))
{guy->movesToNewLocation (xChoice - 1, yChoice, zChoice); break;}
else
guyFacingDirections.erase (it); // more efficient than 'guyFacingDirections.remove (Positive_x);'
}
else if (facingDirectionChoice == Negative_x)
{
if (mainArea.locationAvailable (xChoice + 1, yChoice, zChoice))
{guy->movesToNewLocation (xChoice + 1, yChoice, zChoice); break;}
else
guyFacingDirections.erase (it);
}
else if (facingDirectionChoice == Positive_y)
{
if (mainArea.locationAvailable (xChoice, yChoice - 1, zChoice))
{guy->movesToNewLocation (xChoice, yChoice - 1, zChoice); break;}
else
guyFacingDirections.erase (it);
}
else if (facingDirectionChoice == Negative_y)
{
if (mainArea.locationAvailable (xChoice, yChoice + 1, zChoice))
{guy->movesToNewLocation (xChoice, yChoice + 1, zChoice); break;}
else
guyFacingDirections.erase (it);
}
else if (facingDirectionChoice == Positive_xPositive_y)
{
if (mainArea.locationAvailable (xChoice - 1, yChoice - 1, zChoice))
{guy->movesToNewLocation (xChoice - 1, yChoice - 1, zChoice); break;}
else
guyFacingDirections.erase (it);
}
else if (facingDirectionChoice == Positive_xNegative_y)
{
if (mainArea.locationAvailable (xChoice - 1, yChoice + 1, zChoice))
{guy->movesToNewLocation (xChoice - 1, yChoice + 1, zChoice); break;}
else
guyFacingDirections.erase (it);
}
else if (facingDirectionChoice == Negative_xPositive_y)
{
if (mainArea.locationAvailable (xChoice + 1, yChoice - 1, zChoice))
{guy->movesToNewLocation (xChoice + 1, yChoice - 1, zChoice); break;}
else
guyFacingDirections.erase (it);
}
else if (facingDirectionChoice == Negative_xNegative_y)
{
if (mainArea.locationAvailable (xChoice + 1, yChoice + 1, zChoice))
{guy->movesToNewLocation (xChoice + 1, yChoice + 1, zChoice); break;}
else
guyFacingDirections.erase (it);
}
}
Каков именно контекст здесь? Некоторые блоки if изменяют условные выражения других операторов if? Почему необходимо рандомизировать это поведение? –
Вот фрагмент моего кода (извините, если формат выглядит не очень хорошо - я здесь новый). – prestokeys
Я не думаю, что вы отправили код ... –