2013-02-17 3 views
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 줄의 끝에 일부 이름, 동작 및 위치가 반복됩니다. 당신이 입력 할 모든 이름을 반복하여 사용하지 않게하려면 어떻게해야합니까?

+1

무작위로 선택하기 때문에 반복됩니다. 따라서 반복을 중지하려면 무작위로 선택하지 마십시오. – Jon

+0

무작위로 이름, 동작 또는 위치를 선택하는 임의의 기능이 필요합니다. 여기에 문제가 있습니다. – blackseed32

+0

해결 방법은 배열의 [random_shuffle] (http://en.cppreference.com/w/cpp/algorithm/random_shuffle)입니다. – neam

답변

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; 
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이 있습니다.

임의성을 제거하거나 루프 앞에 임의의 배열 셔플을 수행하십시오 (as demonstrated by Mr @Eladidan). 또는 숫자 0,1,2,3의 배열을 만들고 으로 섞어서 데이터 배열의 인덱스로 사용하십시오.

그것은 그것이 당신에게 반복되지 않는 답을주지 (오히려 추출 임의보다) 셔플 임의 의 본질이다.