0

この種のことに対する答えがあることはすでに知っていますが、コードにそれらを実装する方法が本当にわかりません。また、必要以外の機能の使用は控えたいと思います。これが私のコードです:

int main()
{
 unsigned seed;
 seed = 1;
 srand(seed);
 std::string starFox[8];
 int x[8];
 starFox[0] = "Do a barrel roll!";
 starFox[1] = "Try a somersault!";
 starFox[2] = "Use bombs wisely!";
 starFox[3] = "Something is wrong with the G-diffuser";
 starFox[4] = "Can't let you do that, Star Fox";
 starFox[5] = "Hey Einstein, I'm on your side";
 starFox[6] = "Whoa! help me!";
 starFox[7] = "Daddy screamed REAL good before he died!";

 for(int i=0; i<8; i++)
 {
  int y = 0 + rand() % 8;
  x[i] = y;

  if (x[i-1]!=y || x[i-2]!=y || x[i-3]!=y || x[i-4]!=y || x[i-5]!=y || x[i-6]!=y || x[i-7]!=y)
  {//now I need to make a statement that makes sure each number appears once.
   std::cout << starFox[y] << "\n";}
 }
 std::cout << '\n';

 return 0;
}

では、プログラムが実行されるたびに乱数を生成するには、このコードに何を変更すればよいでしょうか?

4

5 に答える 5

5

std::random_shuffleを使用する

// Shuffle
std::random_shuffle(starFox, starFox + 8);

// And write to standard output
std::copy(starFox, starFox + 8,
          std::ostream_iterator<std::string>(std::cout, "\n"));
于 2010-07-02T20:56:18.127 に答える
1

ランダムシャッフルの解決策:

  • シャッフルしたいすべての数字をコンテナー (ベクトル) に入れます (それを src と呼びます)
  • ランダムに選択した番号を配置するように注文された空のコンテナーを作成します (それを dst と呼びます)。
  • while (src は空ではありません)
    • 乱数 [0,len(src)) を生成します (包括的ではないことに注意してください)
    • src[Rand] の要素を削除します
    • 削除した要素を dst に入れる
于 2010-07-02T20:57:33.960 に答える
1

実行するたびに同じ値をシードしているため、常に同じ疑似乱数シーケンスが得られます。これを試して:

srand(time(0));
于 2010-07-02T21:00:59.220 に答える
0

どの引用符が表示されたかを追跡するために配列を使用するのではなく、引用符をリストに保存し、使用後に引用符を単純に削除するとどうなりますか。

于 2010-07-02T20:52:43.810 に答える
0

ランダムシャッフルについては、このソリューションを確認してください。

于 2010-07-02T20:54:06.220 に答える