zweidimensionales assoziatives Array shuffeln
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
Michael Herrmann schrieb:
> ich habe hier ein Array mit sämtlichen Kundendaten drin und möchte =
diese für
> eine Demo-Version verfremden.
Ansatz:
for ( $i=3D0, $n=3Dcount($kunde); $i<$n; $i++ ) {
do {
$j =3D array_rand( $kunde );
while ( $i =3D=3D $j );
$t =3D $kunde[$i]['vorname'];
$kunde[$i]['vorname'] =3D $kunde[$j]['vorname'];
$kunde[$j]['vorname'] =3D $t;
}
MfG
Niels
--
| 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
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
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
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.
<?php
$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<sizeof($b);$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<sizeof($b);$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
Boris Stumm schrieb:
> Niels Braczek wrote:
>> for ( $i=3D0, $n=3Dcount($kunde); $i<$n; $i++ ) {
>> do {
>> $j =3D array_rand( $kunde );
>> } while ( $i =3D=3D $j );
>> $t =3D $kunde[$i]['vorname'];
>> $kunde[$i]['vorname'] =3D $kunde[$j]['vorname'];
>> $kunde[$j]['vorname'] =3D $t;
>> }
>
> 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
--
| 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 =
|
------------------------------------------------------------ ------