4

我有一个 std::vector 我需要洗牌。它只有约 20 名成员。每次运行程序时,它还需要产生不同的 shuffle。

现在我正在使用random_shuffle,但是每次运行程序时它都会给出相同的结果。我试过这个srand(unsigned(time(NULL)));线程中建议的,但是,这在我的平台上不起作用。

如果可能的话,我只想使用标准代码。

编辑:这是我的实现:

vector<Tile>gameTiles;
gameTiles.push_back(Tile(0,0));
gameTiles.push_back(Tile(0,1));
gameTiles.push_back(Tile(0,2));
gameTiles.push_back(Tile(0,3));
gameTiles.push_back(Tile(0,4));
//etc. ~20 member

random_shuffle(gameTiles.begin(), gameTiles.end());
4

2 回答 2

12

如果srand(unsigned(time(NULL)));没有帮助,那么您的实现不得使用标准rand()作为其随机数生成器。在这种情况下,有一个替代版本random_shuffle采用自定义随机数生成器。您可以只传递一个包装器rand(),如下所示:

int MyRand(int n)
{
    return std::rand() % n;
}

// ...
std::random_shuffle(bar.begin(), bar.end(), MyRand);
// ...

如果您想要分布更均匀的东西,请查看 C++11<random>标头。

于 2012-09-22T05:30:12.637 回答
1

好吧,您给出的实现无法正常工作(您命名了一个类型foo并使用了与变量相同的文字)。无论如何尝试这样的事情

// random generator function:
ptrdiff_t myrandom (ptrdiff_t i) { return rand()%i;}
// pointer object to it:
ptrdiff_t (*p_myrandom)(ptrdiff_t) = myrandom;

int main(void){
  srand(0)
  vector<Tile>gameTiles;
  gameTiles.push_back(Tile(0,0));
  gameTiles.push_back(Tile(0,1));
  gameTiles.push_back(Tile(0,2));
  gameTiles.push_back(Tile(0,3));
  gameTiles.push_back(Tile(0,4));
  random_shuffle(gameTiles.begin(), gameTiles.end(), p_myrandom);
}

它将确保random_shuffle使用标准rand并正确初始化。除非您在同一秒内执行两次应用程序,否则它应该会给出不同的结果,这将导致对rand. 代码从这里开始,但有任何改变,所以我只是使用它。

于 2012-09-22T05:39:50.483 回答