0

これが簡単なゲームの私のコードです。貼り付けてみてください。

#include <iostream>
#include <string>
#include <ctime>
#include <cstdlib>
using namespace std;

int main (void)
{
    string  g[4],
    b[4],
    a[4],
    l[4];

    srand((unsigned int)time(0));

    cout << "Welcome!\n\n";
    cout << "Type 4 girl names.\n";
    for (int gi = 0; gi < 4; gi++) 
        cin >> g[gi];

    cout << "Type 4 boy names.\n";
    for (int bi = 0; bi < 4; bi++)
        cin >> b[bi];

    cout << "\nWhat they do (enter 4 actions)?\n";
    for (int ai = 0; ai < 4; ai++)
        getline(cin, a[ai]);

    cout << "\nWhere is happening (enter 4 locations)?\n";
    for (int li = 0; li < 4; li++)
        getline(cin, l[li]);

    for (int c = 0; c < 4; c++)
        cout << g[rand() % 4] << " and " << b[rand() % 4] << " are " << a[rand() %     4] << " from a " << l[rand() % 4] << endl;

    return (0);
}

4行の最後で、名前、アクション、場所の一部が繰り返されます。入力するすべての名前を繰り返さずに使用しないようにするにはどうすればよいですか?

4

2 に答える 2

1

使用std::random_shuffle

std::random_shuffle(g, g + 4);
std::random_shuffle(b, b + 4);
std::random_shuffle(a, a + 4);
std::random_shuffle(l, l + 4);

次に、シャッフルされたすべての配列を繰り返し処理します。

for (int c = 0; c < 4; c++)
    cout << g[c] << " and " << b[c] << " are " << a[c] << " from a " << l[c] << endl;
于 2013-02-17T13:22:38.723 に答える
0
for (int c = 0; c < 4; c++)
    cout << g[rand() % 4] << " and " << b[rand() % 4] << " are "
         << a[rand() %     4] << " from a " << l[rand() % 4] << endl;

への連続した呼び出しは、への以前の呼び出しと同じ結果をもたらさないrand()ことが保証されていると仮定しましたが、これは根拠がありません。rand()

したがって、繰り返しが発生する可能性は常にあります。実際、64分の1の確率で、毎回同じ答えが得られます。

ランダム性を削除するか、ループの前にランダム配列シャッフルを実行します(@Eladidan氏によって示されているように)。または、数値の配列を作成し、それ0,1,2,3をシャッフルしてから、データ配列へのインデックスとして使用します。

繰り返されない答えを与えるのは、(ランダム抽出ではなく)ランダムシャッフルの性質です。

于 2013-02-17T13:41:27.753 に答える