是否有一些类似于srand()
的函数需要调用以确保std::random_shuffle()
始终产生不同的结果?即如果我用相同的数据多次调用它,我希望每次订单都不同。我怎样才能确定?
答案 0 :(得分:13)
std::random_shuffle
有两种形式。一个需要2个参数(开始/结束迭代器),另一个需要3个(开始/结束迭代器和随机生成器)。
第一个表单使用std::rand()
,因此您可以使用std::srand()
为其随机数生成器播种。您也可以使用3参数版本并自己提供RNG。
答案 1 :(得分:6)
std::random_shuffle
有一个用于指定RNG的模板重载。
template <class RandomAccessIterator, class RandomNumberGenerator>
void random_shuffle ( RandomAccessIterator first, RandomAccessIterator last,
RandomNumberGenerator& rand );
答案 2 :(得分:5)
random_shuffle已被弃用,并被替换为shuffle(自C ++ 11以来存在) http://en.cppreference.com/w/cpp/algorithm/random_shuffle
可能的用法:
shuffle(items.begin(), items.end(), std::default_random_engine(std::random_device()()));
答案 3 :(得分:3)
我认为你可以给std :: random_shuffle一个随机的生成器函子,这样你就可以完全控制随机数的生成。查看here,此仿函数取代了RandomNumberGenerator模板参数。
答案 4 :(得分:3)
通常在调用std :: random_shuffle()之前调用srand(time(NULL))
将为您提供所需内容,每次调用std :: random_shuffle()时,它会给您不同的结果。这是因为std :: random_shuffle()在许多填充实现中内部调用rand()(例如VS2008和gcc)。
当然,如果你想用额外的参数调用另一个重载的std :: random_shuffle,你可以自己补充一个RNG。
答案 5 :(得分:2)
作为最后的手段,您可以:
std::random_shuffle
std::set
我没有看到使用自定义生成器如何保证序列是唯一的。