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 =
|
------------------------------------------------------------ ------