2013-02-06 13 views
14

Czytałem o tym: http://www.cplusplus.com/reference/algorithm/random_shuffle/ i zastanawiałem się, czy możliwe jest losowe_pasowanie tablicy elementów int. To jest mój kodCzy jest możliwe random_shuffle tablicy elementów int?

#include <iostream> 
#include <algorithm> 

using namespace std; 

int main() 
{ 
    int a[10]={1,2,3,4,5,6,7,8,9,10}; 

    cout << a << endl << endl; 

    random_shuffle(a[0],a[9]); 

    cout<<a; 
} 

mam ten błąd:

error C2893: Failed to specialize function template 
    'iterator_traits<_Iter>::difference_type *std::_Dist_type(_Iter)'. 

Moje pytanie to:

  1. Czy to możliwe, aby przetasować int tablicy przy użyciu random_shuffle. Jeśli tak, chciałbym się dowiedzieć, jak to zrobić.

  2. Czy random_shuffle dotyczy tylko szablonów?

  3. Co oznacza mój błąd?

Odpowiedz

32

Trzeba zdać wskaźniki do a[0] i a[10], a nie same elementy:

random_shuffle(&a[0], &a[10]); // end must be 10, not 9 

w C++ 11, można użyć std::begin i std::end:

random_shuffle(std::begin(a), std::end(a)); 
+1

Wiem, że to brzmi głupio, ale skąd znasz jego wskazówki? która część strony tak mówi? – Computernerd

+3

@Computernerd, Wskaźniki są iteratorami dostępu losowego i zajmuje dwa iteratory. – chris

+0

@ALL another qn: Ta metoda przetasuje całą liczbę, gdy zostanie wywołana raz, czy istnieje jakakolwiek metoda, która zamienia 2 liczby tylko raz, gdy jest wywołana? – Computernerd

3

random_shuffle trwa iteratory, zamiast elementów. Spróbuj albo:

std::random_shuffle(a, a + 10); 

lub

std::random_shuffle(std::begin(a), std::end(a)); 

std::random_shuffle może być używany na dowolnej pary losowych iteratorów dostępu i będzie przetasować elementów w zakresie oznaczonym przez te iteratory.

Błąd występuje, ponieważ int s nie są iteratory, a więc std::random_shuffle jest w stanie korzystać z danego int s jako iteratorów.

0

pracował dla mnie w ten sposób:

#include <iostream> 
#include <algorithm> 

using namespace std; 

int main() 
{ 
    int a[10]={0,1,2,3,4,5,6,7,8,9}; 

    for (unsigned i = 0; i < 10; i++) 
    { 
     cout << a[i]; 
    } 
    cout << endl; 

    random_shuffle(&a[0],&a[10]); 

    for (unsigned i = 0; i < 10; i++) 
    { 
     cout << a[i]; 
    } 
    cout << endl; 
} 
+0

Z jakiegoś powodu to zawsze tasuje tablicę w tej samej kolejności, lub czy to jest to, co się tasuje? – Koliat

+1

'srand (time (0))'? –

0

tylko zmiana ARR do wskaźnika nie rozwiązuje rozwiązanie. Spowoduje to zamianę macierzy na jeden typ permutacji. Oznacza to, że jeśli ponownie uruchomisz program, twoja tablica zostanie przemieszana w dokładnie taki sam sposób, jak w poprzednim.

Aby to naprawić - funkcja oferuje trzeci parametr, który działa jak nasiono. Tak więc prawidłowa implementacja funkcji wygląda następująco.

1) Mieć funkcję lub lamdę, która generuje liczbę losową. To będzie działać jak twoje nasienie.

int myrandom (int i) { return std::rand()%i;} 

Upewnij się, że ustawiłeś zarodek wewnętrznego generatora liczb losowych.

std::srand (unsigned (std::time(0))); 

2) Wstaw tę funkcję jako trzeci argument w wywołaniu funkcji random_shuffle.

std::random_shuffle (myvector.begin(), myvector.end(), myrandom); 

Spowoduje to losową losową tablicę. Upewnij się, że zawiera:

#include <algorithm> // std::random_shuffle 
#include <vector>  // std::vector 
#include <ctime>  // std::time 
#include <cstdlib>  // std::rand, std::srand 
Powiązane problemy