std::random_shuffle(b,e)
使用实现定义的随机源,所以这不能被可移植地控制。通常实现使用std::rand()
,因此使用std::srand()
来种子rng经常工作。
// not portable, depends on implementation defined source of randomness in random_shuffle
std::srand(some_seed);
std::random_shuffle(answerPositionArray, answerPositionArray+size);
有的std::random_shuffle()
过载这需要作为第三参数的随机数发生器。您可以使用此表单来定义随机性的来源,以便您可以对其进行播种。
struct RNG {
int operator() (int n) {
return std::rand()/(1.0 + RAND_MAX) * n;
}
};
std::srand(seed);
std::random_shuffle(answerPositionArray, answerPositionArray+size, RNG());
C++ 11引入了另一种算法std::shuffle
,这需要UniformRandomNumberGenerator,让您使用C++ 11 <random>
发电机:
std::random_device r;
std::seed_seq seed{r(), r(), r(), r(), r(), r(), r(), r()};
std::mt19937 eng(seed);
std::shuffle(std::begin(answerPositionArray), std::end(answerPositionArray), eng);
您的意见表明,问题是,你并没有洗牌整个阵列,你只是洗牌前两个元素,最后一个元素没有被触及。
这是如何使用幻数,因为在你的代码的一个很好的示范:
std::random_shuffle(answerPositionArray, answerPositionArray + 2);
^
|
magic number --
容易出错。相反,您应该尝试编写独立于此类值的代码。
// trick for getting an array size
template<typename T, int N> int array_size(T (&)[N]) { return N; }
int answerPositionArray[] = {100, 400, 800};
std::random_shuffle(answerPositionArray,
answerPositionArray + array_size(answerPositionArray));
,或者一旦你可以使用C++ 11可以在阵列使用std::begin
和std::end
:
std::random_shuffle(std::begin(answerPositionArray), std::end(answerPositionArray));
或者你可以在C++ 03使用上述阵列自己实现begin
和end
功能尺寸技巧:
template<typename T, int N> T *begin(T (&a)[N]) { return a; }
template<typename T, int N> T *end(T (&a)[N]) { return a + N; }
这些方法允许您避免使用数组大小的幻数,所以whe当你编写或修改代码时,你不太可能错误地使用错误的值。
你忘了给我看,'std :: srand(std :: time(0))',从我看到的。 – Rapptz
我应该在代码中放置哪一行? – panthro
@ user1013512在任何呼叫任意 – lcs