[C++ Algoritms] Ordinare a caso una lista

Forum dedicato alla programmazione.

Moderatore: Staff

Regole del forum
1) Citare in modo preciso il linguaggio di programmazione usato.
2) Se possibile portare un esempio del risultato atteso.
3) Leggere attentamente le risposte ricevute.
4) Scrivere i messaggi con il colore di default, evitare altri colori.
5) Scrivere in Italiano o in Inglese, se possibile grammaticalmente corretto, evitate stili di scrittura poco chiari, quindi nessuna abbreviazione tipo telegramma o scrittura stile SMS o CHAT.
6) Appena registrati è consigliato presentarsi nel forum dedicato.

La non osservanza delle regole porta a provvedimenti di vari tipo da parte dello staff, in particolare la non osservanza della regola 5 porta alla cancellazione del post e alla segnalazione dell'utente. In caso di recidività l'utente rischia il ban temporaneo.
Rispondi
Spiros
Linux 0.x
Linux 0.x
Messaggi: 36
Iscritto il: lun 3 dic 2007, 12:58
Località: Zurigo (CH)
Contatta:

[C++ Algoritms] Ordinare a caso una lista

Messaggio 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?

Avatar utente
ksniffer
Linux 3.x
Linux 3.x
Messaggi: 540
Iscritto il: lun 30 lug 2007, 13:18
Kernel: 2.6.34
Desktop: KDE 4.4.4
Distribuzione: ArchLinux
Contatta:

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

Messaggio da ksniffer »

gcc 4.1.3? te lo sei installato da te?

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

Spiros
Linux 0.x
Linux 0.x
Messaggi: 36
Iscritto il: lun 3 dic 2007, 12:58
Località: Zurigo (CH)
Contatta:

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

Messaggio 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.

Avatar utente
lamarozzo
Linux 3.x
Linux 3.x
Messaggi: 732
Iscritto il: gio 14 lug 2005, 0:00
Desktop: xfce
Distribuzione: archlinux
Località: Roma

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

Messaggio 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.

Spiros
Linux 0.x
Linux 0.x
Messaggi: 36
Iscritto il: lun 3 dic 2007, 12:58
Località: Zurigo (CH)
Contatta:

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

Messaggio da Spiros »

Si', so come funzionano rand() e srand(). Quindi dovrei inizializzare con srand() o srand48() e la funzione random_shuffle() dara' risultati casuali?

Avatar utente
lamarozzo
Linux 3.x
Linux 3.x
Messaggi: 732
Iscritto il: gio 14 lug 2005, 0:00
Desktop: xfce
Distribuzione: archlinux
Località: Roma

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

Messaggio 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).

Rispondi