-+  Associazione
-+  Documenti
 |-  Modern Perl
 |-  Bibliografia
 |-  Articoli
 |-  Talk
 |-  Perlfunc
 |-  F.A.Q.
 |-  F.A.Q. iclp
-+  Eventi
-+  Community
-+  Blog
-+  Link
Corso di Perl



 


indietro

[48] Come mescolo a caso gli elementi di un array?

Se avete installato Perl 5.8.0 o successivo, o avete installato Scalar-List-Utils 1.03 o successivo, potete scrivere:

    use List::Util 'shuffle';
    @mescolato = shuffle(@lista);

In caso contrario, potete utilizzare l'argoritmo di mescolamento Fisher-Yates:

    sub mescola_fisher_yates {
        my $mazzo = shift;  # $mazzo e` un riferimento ad un array
        my $i = @$mazzo;
        while (--$i) {
            my $j = int rand ($i+1);
            @$mazzo[$i,$j] = @$mazzo[$j,$i];
        }
    }
    # mescola la mia collezione di mpeg
    #
    my @mpeg = <audio/*/*.mp3>;
    mescola_fisher_yates( \@mpeg );    # mescola @mpeg "sul posto"
    print @mpeg;

Notate che l'implementazione sopra indicata mescola un array "sul posto", a differenza di List::Util::shuffle() che prende una lista e ne restituisce una nuova mescolata.

Avete probabilmente visto algoritmi di mescolamento che funzionano utilizzando splice, prendendo a caso un elemento da scambiare con quello corrente.

    srand;
    @nuovo = ();
    @vecchio = 1 .. 10;  # solo una dimostrazione
    while (@vecchio) {
        push(@nuovo, splice(@vecchio, rand @nuovo, 1));
    }

Questa è una cattiva pratica, poiché splice è già O(N) e, poiché lo eseguite N volte, avete appena inventato un algoritmo quadratico; il che significa O(N**2). Esso non scala bene, anche se Perl è così efficiente che probabilmente non noterete la cosa finché non avrete array piuttosto grandi.

vedi in inglese

AUTORE E COPYRIGHT

Copyright (c) 1997, 1998, 1999, 2000, 2001 Tom Christiansen e Nathan Torkington. Tutti i diritti riservati.

Questa documentazione è libera; puoi ridistribuirla e/o modificarla secondo gli stessi termini applicati al Perl.

Indipendentemente dalle modalitè di distribuzione, tutti gli esempi di codice in questo file sono rilasciati al pubblico dominio. Potete, e siete incoraggiati a farlo, utilizzare il presente codice o qualunque forma derivata da esso nei vostri programmi per divertimento o per profitto. Un semplice commento nel codice che dia riconoscimento alle FAQ sarebbe cortese ma non è obbligatorio.

D:
Progetti e documenti in rilievo
Corso di Perl Progetto pod2it
D:
La ML di Perl.it
mongers@perl.it è la lista ufficiale di Perl Mongers Italia per porre quesiti di tipo tecnico, per rimanere aggiornato su meeting, incontri, manifestazioni e novità su Perl.it.
Iscriviti!
D:
Annunci Google