<?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(), 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.