2013-02-06 9 views
14

Stavo leggendo su questo: http://www.cplusplus.com/reference/algorithm/random_shuffle/ e mi chiedevo se fosse possibile random_shuffle una matrice di elementi int. Questo è il mio codiceÈ possibile random_shuffle una matrice di elementi 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; 
} 

ho ottenuto questo errore:

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

La mia domanda è:

  1. E 'possibile mischiare un array int utilizzando random_shuffle. Se sì, mi piacerebbe imparare come farlo.

  2. È random_shuffle applicabile solo ai modelli?

  3. Che cosa significa il mio errore?

risposta

32

è necessario passare puntatori a a[0] e a[10], non gli elementi stessi:

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

In C++ 11, è possibile utilizzare std::begin e std::end:

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

so che sembra stupido ma come fai a sapere i suoi indicatori? quale parte della pagina dice così ?? – Computernerd

+3

@Computernerd, I puntatori sono iteratori ad accesso casuale e richiedono due iteratori. – chris

+0

@ALL altro qn: questo metodo mischia tutto il numero quando viene chiamato una volta, esiste un metodo che scambia 2 numeri solo una volta quando viene chiamato ?? – Computernerd

3

random_shuffle prende iteratori, piuttosto che elementi. Prova uno:

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

o

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

std::random_shuffle può essere utilizzato su qualsiasi coppia di iteratori ad accesso casuale, e si rimescola gli elementi nell'intervallo indicato con tali iteratori.

L'errore si verifica perché int s non sono iteratori, e così std::random_shuffle è in grado di usare i int s come iteratori.

0

lavorato per me in questo modo:

#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

Per qualche motivo questo rimescola sempre l'array nello stesso ordine O è questo che parla di shuffle? – Koliat

+1

'srand (time (0))'? –

0

Basta cambiare l'arr a un puntatore non risolve la soluzione. Questo farà sì che l'array si sposti su un tipo di permutazione. Ciò significa che se si esegue nuovamente il programma, la matrice verrà mescolata esattamente nello stesso modo in cui si trovava nella corsa precedente.

Per risolvere questo problema, la funzione offre un terzo parametro che funge da seme. Quindi l'implementazione corretta della funzione è la seguente.

1) Avere una funzione o una lamda che genera un numero casuale. Questo fungerà da seme.

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

Assicurarsi di impostare il seme del generatore di numeri casuali interno.

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

2) Inserire questa funzione come terza argomentazione nella chiamata di funzione random_shuffle.

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

Ciò comporterà un array casuale casuale. Assicurati di includere quanto segue:

#include <algorithm> // std::random_shuffle 
#include <vector>  // std::vector 
#include <ctime>  // std::time 
#include <cstdlib>  // std::rand, std::srand 
Problemi correlati