array mischen...

hi,

Ich suche ne möglichst effiziente Funktion zum mischen von Arrays...
Durch Google bin ich auf fisher_yates_shuffle gestoßen, eider gibt mir diese funktion immer "0" zurück/aus...

Ich hab einen Array mit mehr oder weniger sortierten Elementen.
Diese möchte ich jetzt einfach so effizient wie möglich durchmischen...
 
Ich würde das über einen zufälligen Array-Index lösen. Etwa in der Art:

Code:
my $arraysize = @array1;

foreach(@array1) {
    $randval = rand($arraysize);
    $array2[$randval] = $_;
}

Muß natürlich noch eine Überprüfung rein, daß du kein Array-Element doppelt beschreibst.
 
Dadurch gehen doch aber Einträge verloren.

Du lässt es ja nur "$arraysize"-mal durchlaufen.
Es ist aber nicht gesagt dass währen dieser Durchläufe alle Elemente von $array1 durch "rand($arraysize)" erfasst werden!?

(kann es grad net testen da meine VM irgendwie tot ist...)

[ EDIT: ] sorry denkfehler ^^
 
Deswegen sagte ich ja, daß du noch eine Überprüfung einbauen mußt, damit kein Element doppelt beschrieben wird. Dadurch dürfte dann eigentlich nichts verloren gehen.
 
Code:
#!/usr/bin/perl -wT
use strict;

sub fisher_yates_shuffle
{
	my $array = shift;
	my $i;
	for ($i = @$array; --$i;)
	{
		my $j = int rand($i+1);
		next if $i == $j;
		@$array[$i,$j] = @$array[$j,$i];
	}
}

my @array = qw(Eins Zwei Drei Vier Fuenf);
fisher_yates_shuffle(\@array);
print foreach (@array);

Das ist das fisher_yates_shuffle-Beispiel aus dem Perl Kochbuch. Funktioniert einwandfrei .
 
Zurück
Oben