Pagina 1 di 1

[C++ Algoritms] Ordinare a caso una lista

Inviato: lun 18 feb 2008, 20:23
da Spiros
Qui (http://www.cppreference.com/cppalgorith ... uffle.html) ho trovato un algoritmo che mi serve: ho una lista di tot elementi e vorrei che questi venissero ordinati pseudo-casualmente (non mi interessa molto la vera e propria casualità).
Ho provato così:

Codice: Seleziona tutto

random_shuffle(lista.begin(), lista.end());
ma g++ ha restituito:

Codice: Seleziona tutto

/usr/include/c++/4.1.3/bits/stl_algo.h: In function ‘void std::random_shuffle(_RandomAccessIterator, _RandomAccessIterator) [with _RandomAccessIterator = std::_List_iterator<int>]’:
Tabella.cpp:58:   instantiated from here
/usr/include/c++/4.1.3/bits/stl_algo.h:1905: error: no match for ‘operator+’ in ‘__first + 1’
Tabella.cpp:58:   instantiated from here
/usr/include/c++/4.1.3/bits/stl_algo.h:1906: error: no match for ‘operator-’ in ‘__i - __first’
make: *** [Tabella.o] Error 1

Quindi non ho sbagliato io, ma chi ha scritto la funzione? Oppure devo usare vectors e non posso con le liste?

Re: [C++ Algoritms] Ordinare a caso una lista

Inviato: lun 18 feb 2008, 23:15
da ksniffer
gcc 4.1.3? te lo sei installato da te?

incolla un po' di codice così verifico dov'è l'errore.

Re: [C++ Algoritms] Ordinare a caso una lista

Inviato: mar 19 feb 2008, 7:46
da Spiros
No, da repository (Ubuntu).
Comunque ho risolto con le deque (ho visto qui che è la più completa) al posto della list. Con questa non ho più quel problema.
Ma ora vorrei poter avere una permutazione più casuale. Evidentemente la casualità viene inizializzata sempre nello stesso modo, perché si ottiene sempre lo stesso risultato.
Se volete un po' di codice, ma ci vorrà un po' di spazio per spiegarvelo. Ho derivato una classe dai bitset<961> per aggiungere qualche metodo.

Re: [C++ Algoritms] Ordinare a caso una lista

Inviato: mar 19 feb 2008, 9:09
da lamarozzo
La lista ti viene ordinata sempre allo stesso modo perchè devi inizializzare il generatore di numeri random con un seed diverso ogni volta.

Se usi rand() l'initializzatore è srand(long int seed), altrimenti (scelta consigliata) per drand48 c'è srand48(long int seed). Una tecnica comune consiste nell'inizializzare il generatore con l'ora di sistema cosicchè avrai una lista diversa per ogni secondo del giorno. Ad esempio

Codice: Seleziona tutto

#include <time.h>
...
srand48(time(0));
...
Ciao.

Re: [C++ Algoritms] Ordinare a caso una lista

Inviato: mar 19 feb 2008, 16:44
da Spiros
Si', so come funzionano rand() e srand(). Quindi dovrei inizializzare con srand() o srand48() e la funzione random_shuffle() dara' risultati casuali?

Re: [C++ Algoritms] Ordinare a caso una lista

Inviato: mar 19 feb 2008, 18:15
da lamarozzo
se quelle sono le funzioni utilizzate da random_shuffle(), ogni volta che usi un seed diverso per l'inizializzazione dovresti avere sequenze casuali completamente diverse (o meglio scorrelate).