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 回答