Wieso ergibt folgender PHP-Code nicht 50?

Hallo zusammen

Unten seht Ihr einen (sinnlosen, nur zu Testzwecken entworfenen) PHP-Code. Wenn man den Code kurz logisch anschaut, sollte dieser immer mehr oder weniger 50 ergeben. Tut er aber nicht, das Resultat liegt immer zwischen 63 und 65. Kann mir jemand erklären wieso das so ist? Wo liegt die Ungenauigkeit?

Danke & Gruss

<?php $result = 0;<br />$pass = 0;

for($i = 0; $i \< 100; $i++)
{
 $hashes = array();

 for($y = 0; $y \< 100; $y++)
 {
 $hashes[] = mt\_rand(0, 100);
 }

 $result += count(array\_unique($hashes));
 $pass++;
}

echo $result / $pass;

?\>

Hallo zusammen

Unten seht Ihr einen (sinnlosen, nur zu Testzwecken
entworfenen) PHP-Code. Wenn man den Code kurz logisch
anschaut, sollte dieser immer mehr oder weniger 50 ergeben.

warum erwartest du das?

Tut er aber nicht, das Resultat liegt immer zwischen 63 und
65. Kann mir jemand erklären wieso das so ist? Wo liegt die
Ungenauigkeit?

naja, ich vermute, du hast was anderes erwartet.
dein algo errechnet grob die anzahl der uniqen elemente aus einer menge von 100 würfen. da wuerde ich aber nicht 50 erwarten - nach messung sind es zw. 55 und 75

das ist mir erst aufgefallen, als ich deine zeile

> $result += count(array\_unique($hashes));

umformuliert habe in:

$n = count(array\_unique($hashes));
$result += $n;
$pass++;

print "$pass:blush:n:blush:result\n";
<?php :
$result = 0; $pass = 0; for($i = 0; $i \< 100; $i++) { $hashes = array(); for($y = 0; $y \< 100; $y++) { $hashes[] = mt\_rand(0, 100); } $result += count(array\_unique($hashes)); $pass++; } echo $result / $pass; ?\>

Wenn ich das richtig verstehe - und das ist nicht so leicht, weil ich den Sinn des Scripts nicht ganz verstehe, bzw. den Einsatzbereich - dann lässt du 100 x 100 Zufallszahlen zwischen 0 (inklusive) und 100 (inklusive) werfen. Nach jedem Schleifendurchlauf der ersten Ebene, lässt du $hashes löschen.

Das bedeutet, dass Ebene 2 genau 100 Durchläufe machen darf, dann von allen 100 Zufallszahlen die doppelten entfernt (array_unique()), und die Anzahl der verschiedenen Zahlen dann in $result zwischenspeichert.

$pass wird bei allen 100 Durchläufen um 1 imkrementiert, sodass es später die 100 beherbergt.

Da du aber bei jedem Schleifendurchlauf der Ebene 1 $hashes löschst ($hashes = array():wink:, glaube ich, verfälscht es das Ergebnis. Schlimmer wird es durch
$result += count(array_unique($hashes));
Wodurch 100 mal von 100 Zufallswürfen alle unterschiedlichen Zahlen gespeichert werden, aber leider nicht von allen 10000 Zufallszahlen die unterschiedlichen.

Ich erkläre und analysiere vielleicht wirr, aber was ich meine:

In den ersten 100 Durchläufen kann zweimal die 2 vorkommen -> eine wird rausgefiltert. In dem zweiten 100 Durchläufen kann aber auch nochmal mehrmals eine 2 vorkommen, wodurch aber trotzdem die eine 2 wieder als NEUE Zahl erkannt wird. Verständlich?

Wenn nicht, kann ich es ggf. umschreiben. Ob es dann jedoch den gewünschten Effekt hat, ist eine andere Frage, denn deine gewünschte 50 würde wahrscheinlich trotzdem nicht hrauskommen.