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

时间:2016-09-20 16:13:38

标签: 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);
    }
 }

但是,我有两个问题:

  • 如果两个特工连续移动,他们会做同样的动作,因为随机数取决于时间。
  • 如果代理人在彼此之后进行多轮比赛,则两个代理人的移动与之前游戏中的移动相同。所以最终网格总是相同的,并且在大多数情况下,1个代理最终赢得95%-100%的游戏。

所有帮助将受到高度赞赏,谢谢!

2 个答案:

答案 0 :(得分:5)

问题在于:

srand(time(nullptr));

您每次都要重置种子。如果两次通话之间的时间很短,则会产生相同的随机数。

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

答案 1 :(得分:3)

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>