1

三目並べゲームを作っていて、今プレイヤーの対戦相手を作っています。ご存知のように、三目並べの試合には 9 つのフィールドがあるため、他の X と O によって既に使用されているすべてのフィールドを含むベクトルを作成しました。

std::vector<int> UsedPositions;

そのため、srand(time()) でランダムな値を取得しようとする前に、ベクトルを反復処理して、その位置が既に使用されているかどうかを確認しました。実際には機能しましたが、ご想像のとおり、貧弱な CPU では多くの計算 (したがって時間) がかかりました。これは、ベクトルに約 8 つの要素がある場合、8 回反復する必要があることを意味するためです (つまり、乱数がそうでなければ、それをさらに 8 回通過する必要があります)。

TL;DR - ベクトルから < 10 && > 0 の個別のランダム値を取得するにはどうすればよいですか?

私にとって遅いコード:

int FindUniqueAnswer()
{
    int answer;
    bool AnswerFound = false;

    while(!AnswerFound)
    {
        bool DoesntEqual = true;
        srand(time(0));
        int random = rand()%10;
        if(random == 0)
        {
            random++;
        }

        for(int i = 0;i<UsedPositions.size();i++)
        {
            if(random == UsedPositions.at(i))
            {
                DoesntEqual = false;
                break;
            }
        }
        if(DoesntEqual)
        {
            answer = random;
            AnswerFound = true;
        }
    }

    return answer;
}
4

1 に答える 1

2
#include <random>
#include <algorithm>
...
vector<int> v = {1, 2, 3, 4, 5, 6, 7, 8, 9};
std::random_device rd
mt19937 g(rd());
shuffle(v.begin(), v.end(), g);

cppreference.comからコピー

于 2012-09-09T03:54:28.730 に答える