У меня есть фрагмент кода, который генерирует мини-миссии для игроков. Это просто и получить две различные точки (начало и назначения) У меня есть алгоритм, который выглядит следующим образом:Как получить два (псевдо) случайных, но отличающихся друг от друга итераторами контейнеров/элементов?
std::vector<std::string> missions;
missions.push_back("Location_One");
missions.push_back("Location_Two");
missions.push_back("Location_Three");
//make sure our data has at least 2 elements (so we can actually pick two)
if(missions.size() > 1)
{
//Rand(inclusive min, exlusive max)
int mission_start_location = Rand(0,missions.size());
int mission_end_location = Rand(0,missions.size());
if(mission_start_location == mission_end_location)
{
//avoid possile infinite loop of calling "Rand" by Add/Decrement-if-equal algorithm
//basicly if mission_start_location == 0
if(!mission_start_location)
++mission_end_location;//or = 1, we have at least two elements so index 1 is valid
else
--mission_end_location;//so we won't got out of range
}
//do mission
}
else
{
//error
}
Это работает, но мне было интересно, если есть лучший способ добиться того, чего я хочу " путь C++ ».
Мои вопросы:
- Является ли это лучший способ, чтобы получить два различных значения из контейнера?
- Что касается контейнеров с нецелым индексом (например,
std::map<std::string,std::string>
)? -
- Как бы получить из него два разных и случайных значения?
Примечание: Я хорошо осведомлены о методе do { } while(rand1 == rand2)
. Я хочу этого избежать, потому что может зайти в бесконечный цикл (зная, что мне повезет в производственном коде).
Ваши два случайных значения не являются _independent_: 'mission_end_location == (mission_start_location-1)' более вероятен, чем другие варианты. Это, вероятно, не то, что вы намеревались? – jogojapan
это единственный способ, которым я могу придумать, чтобы избежать того же «случайного» номера, не вызывая Rand() и бесконечное количество раз (например, как-то rand всегда будет возвращать 0, то что?) - не происходит, но я хочу избежать этого в будущем – Gizmo
@jogojapan - вот что я хотел бы избежать, если возможно, – Gizmo