zweidimensionales assoziatives Array shuffeln

zweidimensionales assoziatives Array shuffeln

am 15.01.2008 10:22:01 von Michael Herrmann

Hallo,

ich habe hier ein Array mit sämtlichen Kundendaten drin und möchte diese für
eine Demo-Version verfremden.
Irgendwie stehe ich nur grade auf dem Schlauch.

Hier das Ausgangs-Array:

kunde[0]=array('nachname' => 'Meier', 'vorname' => 'Max');
kunde[1]=array('nachname' => 'Huber', 'vorname' => 'Heinz');
kunde[2]=array('nachname' => 'Fasel', 'vorname' => 'Franz');
kunde[3]=array('nachname' => 'Dödel', 'vorname' => 'Doris');

(Der Einfachheit halber sind Vornamen und Nachnamen immer mit dem gleichen
Anfangsbuchstaben, damit man sie besser zusammenhalten kann. Außerdem habe
ich das Array stark gekürzt, um die Funktionsweise besser darzustellen).

Nun möchte ich dieses Array so durcheinanderbringen, dass z.B. folgende
Ausgabe rauskommen könnte:

kunde[0]=array('nachname' => 'Fasel', 'vorname' => 'Heinz');
kunde[1]=array('nachname' => 'Dödel', 'vorname' => 'Max');
kunde[2]=array('nachname' => 'Meier', 'vorname' => 'Doris');
kunde[3]=array('nachname' => 'Huber', 'vorname' => 'Franz');

Wie mache ich das am schlauesten?



--
Michael Herrmann

Re: zweidimensionales assoziatives Array shuffeln

am 15.01.2008 13:22:10 von Niels Braczek

Michael Herrmann schrieb:

> ich habe hier ein Array mit sämtlichen Kundendaten drin und möchte =
diese für
> eine Demo-Version verfremden.=20

Ansatz:

for ( $i=3D0, $n=3Dcount($kunde); $i<$n; $i++ ) {
do {
$j =3D array_rand( $kunde );
while ( $i == $j );
$t =3D $kunde[$i]['vorname'];
$kunde[$i]['vorname'] =3D $kunde[$j]['vorname'];
$kunde[$j]['vorname'] =3D $t;
}

MfG
Niels

--=20
| http://www.kolleg.de =B7 Das Portal der Kollegs in Deutschland |
| http://www.bsds.de =B7 BSDS Braczek Software- und DatenSysteme |
| Webdesign =B7 Webhosting =B7 e-Commerce =B7 Joomla! Content Management =
|
------------------------------------------------------------ ------

Re: zweidimensionales assoziatives Array shuffeln

am 15.01.2008 17:27:08 von Claus Reibenstein

Michael Herrmann schrieb:

> Nun möchte ich dieses Array so durcheinanderbringen, dass [...]
>
> Wie mache ich das am schlauesten?

Mit Hilfe eines Zufallszahlengenerators die Reihenfolge ändern.

Gruß. Claus

Re: zweidimensionales assoziatives Array shuffeln

am 16.01.2008 10:10:47 von Boris Stumm

Niels Braczek wrote:
> for ( $i=0, $n=count($kunde); $i<$n; $i++ ) {
> do {
> $j = array_rand( $kunde );
> } while ( $i == $j );
> $t = $kunde[$i]['vorname'];
> $kunde[$i]['vorname'] = $kunde[$j]['vorname'];
> $kunde[$j]['vorname'] = $t;
> }

Das funktioniert, aber nicht jede Kombination ist gleich
wahrscheinlich (d.h., das Ergebnis ist nicht zufällig).

Um jedes Ergebnis gleich wahrscheinlich zu machen, muss es statt
$j = array_rand($kunde);
so heißen:
$j = $kunde[rand($i, $n - 1)];

Kann jetzt noch ein off-by-one-Fehler drin sein.
Warum das so ist, steht im Puzzle 94 im Buch "Java Puzzlers"
http://www.javapuzzlers.com/

Re: zweidimensionales assoziatives Array shuffeln

am 16.01.2008 12:03:42 von dafox

Boris Stumm schrieb:
> Niels Braczek wrote:
>> for ( $i=0, $n=count($kunde); $i<$n; $i++ ) {
>> do {
>> $j = array_rand( $kunde );
>> } while ( $i == $j );
>> $t = $kunde[$i]['vorname'];
>> $kunde[$i]['vorname'] = $kunde[$j]['vorname'];
>> $kunde[$j]['vorname'] = $t;
>> }

> Das funktioniert, aber nicht jede Kombination ist gleich
> wahrscheinlich (d.h., das Ergebnis ist nicht zufällig).

ACK.

$n=1000000;
$a=array(1,2,3,4,5,6,7,8,9,10);
$b=array();

srand(time());

for($i=0;$i < 10;$i++) {
$b[$i] = 0;
}

for($i=0;$i<$n;$i++) {
$key=array_rand($a);
$b[$key]++;
}

for ($i=0;$i printf("%d: %04.1f%%\n", $i, ($b[$i]/$n*100));
}

print "\n\n";

for($i=0;$i < 10;$i++) {
$b[$i] = 0;
}

for($i=0;$i<$n;$i++) {
$key=rand(0, 9);
$b[$key]++;
}

for ($i=0;$i printf("%d: %04.1f%%\n", $i, ($b[$i]/$n*100));
}
?>

0: 10.3%
1: 10.2%
2: 09.7%
3: 10.2%
4: 09.6%
5: 09.8%
6: 10.3%
7: 09.7%
8: 09.9%
9: 10.3%

0: 10.0%
1: 10.0%
2: 10.0%
3: 10.0%
4: 10.0%
5: 10.0%
6: 10.0%
7: 10.0%
8: 10.0%
9: 10.0%

--
"Faulheit ist die Wurzel allen Fortschritts!"
(Inhalt eines Knallbonbons, 2002)

Re: zweidimensionales assoziatives Array shuffeln

am 16.01.2008 12:22:35 von Niels Braczek

Boris Stumm schrieb:
> Niels Braczek wrote:

>> for ( $i=3D0, $n=3Dcount($kunde); $i<$n; $i++ ) {
>> do {
>> $j =3D array_rand( $kunde );
>> } while ( $i == $j );
>> $t =3D $kunde[$i]['vorname'];
>> $kunde[$i]['vorname'] =3D $kunde[$j]['vorname'];
>> $kunde[$j]['vorname'] =3D $t;
>> }
>=20
> Das funktioniert, aber nicht jede Kombination ist gleich
> wahrscheinlich (d.h., das Ergebnis ist nicht zufällig).

Erstens schrieb ich ja, dass es sich nur um einen Ansatz handelt;
zweitens: Nur weil es sich nicht um eine LaPlace-Verteilung handelt,
heißt es nicht, dass es nicht zufällig (im Rahmen der Möglichkeiten=

eines endlichen Automaten) ist.

MfG
Niels

--=20
| http://www.kolleg.de =B7 Das Portal der Kollegs in Deutschland |
| http://www.bsds.de =B7 BSDS Braczek Software- und DatenSysteme |
| Webdesign =B7 Webhosting =B7 e-Commerce =B7 Joomla! Content Management =
|
------------------------------------------------------------ ------