2

私は正常に動作しているこのコードを書きましたが、出力は常に同じです。だから、それについてランダムなことは何もありません。その理由を知りたい!仮定: 33 人の生徒 1 行目: 7 人の生徒 2 行目: 9 人の生徒 3 行目: 9 人の生徒 4 行目: 8 人の生徒

#include <iostream>
#include <vector>
#include <algorithm>
#include <ctime>
using namespace std;

int main() {
   vector<int> random;

   for (int i = 1; i < 34; i++)
      random.push_back(i);

   random_shuffle(random.begin(), random.end());

   for (int i = 1; i < 8; i++)
      cout << random[i] << " " ;
   cout << endl;

   int i = 7;
   int num_seats = 1;

   for (int j = 1; j <=3; j++) {
      while (num_seats < 10 && i < 33) {
         cout << random[i++] << " " ;
         num_seats++;
      }
      cout << endl;
      num_seats = 1;
   }
}
4

2 に答える 2

8

最初に乱数発生器を初期化する必要があります。乱数の生成は「シード値」に依存します。プログラムが実行されるたびに一意のシード値を取得するには、現在の時刻に依存できます。time(NULL)現在の時間を表す秒数を返します。これは、その一意のシードにすることができます。

これを最初の行に追加してみてくださいmain()

srand(unsigned(time(NULL)));
于 2012-06-21T15:04:50.573 に答える
2

使用random_shuffle()するオーバーロードは、不特定の乱数ソースにアクセスします。ほぼ確実に を使用しています。これは、さまざまなランダム シャッフルを得るためにシードするためにrand()を使用する必要があることを意味します。srand()

ただし、より移植性の高い解決策は、ランダム性のソースを指定することです。これにより、が使用されていると仮定する必要がなくなりますrand()。実装が C++11 の場合、最適なオプションはライブラリshuffle()のエンジンを使用することです。<random>

#include <random>
#include <algorithm>

#include <vector>
#include <numeric>
#include <iterator>
#include <iostream>

int main() {
    std::vector<int> v(34);
    iota(begin(v), end(v), 1);

    std::random_device r;
    std::seed_seq seed{r(), r(), r(), r(), r(), r(), r(), r()};
    std::mt19937_64 eng(seed);

    shuffle(begin(v), end(v), eng);

    copy(begin(v), end(v), std::ostream_iterator<int>(std::cout, " "));
    std::cout << '\n';
}

C++11 がない場合random_shuffle()は、乱数ジェネレーターを使用するオーバーロードを使用して、プログラムがランダム性のソースを移植可能に指定できるようにすることができます。

#include <cstdlib>
#include <ctime>
#include <algorithm>

#include <vector>
#include <iterator>
#include <iostream>

struct RNG {
    int operator() (int n) {
        return static_cast<int>(std::rand()/(static_cast<double>(RAND_MAX)+1) * n);
    }
};

int main() {
    std::vector<int> v(34);
    for (int i=0; i < v.size(); ++i)
        v[i] = i + 1;

    std::srand(std::time(NULL));
    random_shuffle(v.begin(), v.end(), RNG());

    copy(v.begin(), v.end(), std::ostream_iterator<int>(std::cout, " "));
    std::cout << '\n';
}
于 2012-06-21T15:37:44.070 に答える