C++ 随机代理移动是相同的

标签 c++ random srand

<分区>

我使用此函数生成数字 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);
    }
 }

但是,我有两个问题:

  • 如果两个智能体连续移动,则由于随机数取决于时间,因此他们会移动相同的移动。
  • 如果代理人在彼此之后玩多轮,则两个代理人的 Action 与前一局的 Action 相同。所以最终网格总是相同的,在大多数情况下,1 个智能体最终赢得 95%-100% 的游戏。

非常感谢所有帮助,谢谢!

最佳答案

问题出在:

srand(time(nullptr));

您每次都在重置种子。如果两次调用之间的时间很短,将生成相同的随机数。

删除该行并将其放在程序的开头。

关于C++ 随机代理移动是相同的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39599058/

相关文章:

javascript - 在 JavaScript 中生成带有随机数的按钮并插入到 DOM 中

Python ctypes : doesn't load dll as expected

c++ - Pollard Rho 在不太大的输入上崩溃

c# - 如何使用带有参数的 CreateProcessAsUser 是日语?

c - 是否允许 srand(0) 具有与 srand(1) 相同的效果?

c++ - 正确播种随机数生成器(Mersenne twister)c++

c++ - 编写更通用的指针代码

c - 返回伪随机数-C 编程语言

java - 从 Java.util.Deque 中选择一个随机元素