我有一个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());
答案 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的代码,但有任何改变,所以我只是使用它。