C++ 随机代理移动是相同的
C++ random agent moves are identical
我使用此函数生成数字 0、1、2、3 的随机排列,这些排列由代理在 Tron 游戏的二维网格中转换为移动。
srand(time(nullptr));
vector<int> permutationMoves = { 0, 1, 2, 3 };
auto currentIndexCounter = permutationMoves.size();
for (auto iter = permutationMoves.rbegin(); iter != permutationMoves.rend();
iter++, --currentIndexCounter) {
int randomIndex = rand() % currentIndexCounter;
if (*iter != permutationMoves.at(randomIndex)) {
swap(permutationMoves.at(randomIndex), *iter);
}
}
但是,我有两个问题:
- 如果两个智能体连续移动,他们会移动相同的移动,因为随机数取决于时间。
- 如果智能体接连进行多轮,则两个智能体的走法与前一局的走法相同。所以最终网格总是相同的,在大多数情况下,1 个代理最终赢得了 95%-100% 的游戏。
非常感谢所有帮助,谢谢!
问题出在:
srand(time(nullptr));
你每次都在重新设置种子。如果两次调用之间的时间很短,将生成相同的随机数。
删除该行并将其放在程序的开头。
rand()
和 srand
是伪随机数生成器,因此您可以使用 C++11 方式生成随机数。
std::random_device randomDevice;
std::mt19937 generator(randomDevice());
std::uniform_int_distribution<> distribution(1, 100);
int randNum = distribution(generator);
确保你#include <random>
我使用此函数生成数字 0、1、2、3 的随机排列,这些排列由代理在 Tron 游戏的二维网格中转换为移动。
srand(time(nullptr));
vector<int> permutationMoves = { 0, 1, 2, 3 };
auto currentIndexCounter = permutationMoves.size();
for (auto iter = permutationMoves.rbegin(); iter != permutationMoves.rend();
iter++, --currentIndexCounter) {
int randomIndex = rand() % currentIndexCounter;
if (*iter != permutationMoves.at(randomIndex)) {
swap(permutationMoves.at(randomIndex), *iter);
}
}
但是,我有两个问题:
- 如果两个智能体连续移动,他们会移动相同的移动,因为随机数取决于时间。
- 如果智能体接连进行多轮,则两个智能体的走法与前一局的走法相同。所以最终网格总是相同的,在大多数情况下,1 个代理最终赢得了 95%-100% 的游戏。
非常感谢所有帮助,谢谢!
问题出在:
srand(time(nullptr));
你每次都在重新设置种子。如果两次调用之间的时间很短,将生成相同的随机数。
删除该行并将其放在程序的开头。
rand()
和 srand
是伪随机数生成器,因此您可以使用 C++11 方式生成随机数。
std::random_device randomDevice;
std::mt19937 generator(randomDevice());
std::uniform_int_distribution<> distribution(1, 100);
int randNum = distribution(generator);
确保你#include <random>