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あなたがC++ 11台の<random>
発電機を使用することができ、するUniformRandomNumberGeneratorを取る別のアルゴリズムstd::shuffle
が導入されています。あなたのご意見は、問題があることであったことを示している
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);
をあなたは最初の2つの要素をシャッフルしていただけで、最後の要素には触れていなかったということは、配列全体をシャッフルしていないことでした。
これはあなたのコードのように、マジックナンバーを使用する方法の良いデモです:
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; }
これらの方法では、配列サイズにマジックナンバーを使用する必要がなくなりますあなたが間違った値を間違って使用する可能性が低いコードを書いたり変更したりします。
私は見ているものから、 'std :: srand(std :: time(0))'を忘れてしまいました。 – Rapptz
コードにその行をどこに入れる必要がありますか? – panthro
@ user1013512ランダムに電話する前に – lcs