プレイヤーが行うミニミッションを生成するコードがあります。それは簡単で、2 つの異なるポイント (出発地と目的地) を取得するために、次のようなアルゴリズムがあります。
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++の方法」があるかどうか疑問に思っていました。
私の質問は次のとおりです。
- これはコンテナから 2 つの異なる値を取得する最良の方法ですか?
- 非整数インデックス コンテナ (例:
std::map<std::string,std::string>
) はどうですか? - そこから2つの異なるランダムな値を取得するにはどうすればよいですか?
注:私はそのdo { } while(rand1 == rand2)
方法をよく知っています。無限ループに陥る可能性があるため、これを避けたいと思います (運が良ければ、運用コードでそうなることがわかっています)。