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
它采用 Uniform RandomNumberGenerator,允许您使用 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
and std::end
在数组上:
std::random_shuffle(std::begin(answerPositionArray), std::end(answerPositionArray));
或者你可以实施begin
and end
使用上面的数组大小技巧在 C++03 中自行运行:
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; }
这些方法允许您避免使用幻数来表示数组大小,因此当您编写或修改代码时,您不太可能错误地使用错误的值。