2013-02-17 2 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(), но это необоснованно.

Таким образом, всегда есть вероятность, что вы получите повторы; на самом деле, есть шанс 1 из 64, что вы получите одинаковый ответ каждый раз.

Либо удалите случайность, либо выполните случайный перетасовка массива перед циклом (as demonstrated by Mr @Eladidan). Или создайте массив чисел 0,1,2,3, shuffle , который, а затем используйте его как индексы в свои массивы данных.

Это природа случайных перетасовка (а не случайная добыча), что даст вам неповторяющийся ответ.