在C ++中的随机向量

时间:2012-09-22 05:13:00

标签: c++ vector shuffle

我有一个std :: vector,我需要随机播放。它只有大约20名成员。每次运行程序时,它还需要产生不同的随机播放。

现在我正在使用random_shuffle,但是,每次运行程序时它都会给出相同的结果。我尝试了this线程中建议的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());

2 个答案:

答案 0 :(得分:10)

如果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>标题。

答案 1 :(得分:0)

您提供的实现无法正常工作(您将类型命名为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使用相同的种子。 它来自here的代码,但有任何改变,所以我只是使用它。