random funktion

alkaline

Mitglied
Ich ärgere mich grade mit der Random funktion rand() rum...
Folgendes Problem: Ich will über ein Ereignis eine statistische Aussage treffen und benötige dafür in php eine ordentliche random Funktion, die sehr häufig hintereinander Zufallszahlen generieren kann. Sie wird in for-Schleifen zum Einsatz kommen.
Das ganze kann man sich ungefähr so vorstellen:
PHP:
srand(microtime()*1000000);
for($a = 1;$a <= 100; $a++)
{
	
	for($i = 1;$i <= 500; $i++)
	{

		$zufall = rand(1,10000);

		if ($zufall % 2 == 0)
                 usw....

was mich jetzt sehr erstaunt ist die Tatsache, daß der Bereich der rand Funktion (im obigen Beispiel von 1 bis 10000), obwohl ich die Zahl danach eh modulo 2 nehme, enorme Auswirkungen auf das Endergebnis hat. Eigendlich müsste es egal sein ob der Bereich bei modulo 2 von 1 bis 2, von 1 bis 10, oder von 1 bis 1000000000 geht. Ist es aber nicht.
Wer kann mir bei meinem Problem weiterhelfen?
 
...sowas mach ich normal nicht, aber da das ganze für mich sehr wichtig ist, schieb ich die Frage doch nochmal vor. Ich bitte um Verzeihung...
 
Versuchs mal mit mt_rand(). Soll laut php.net bessere Zufallszahlen erzeugen.
Btw. Seit PHP 4.2.0 ist es nicht mehr nötig, den Zufallszahlengenerator zu initialisieren.
 
bringt leider auch nicht das gewünschte Ergebnis...
Vielleicht muss ich mich damit abfinden, dass PHP für mein Problem ungeeignet ist, da die Zufallszahlen "schlecht" sind...
Bin natürlich auch weiterhin sehr dankbar für Ideen.
 
naja, was genau "schlecht" ist weiss ich selber nicht. Was ich allerdings weiss ist, dass bei einer variation des Zahlenbereichs die Ergebnisse stark variieren. Und bei modulo 2 dürfte es wie gesagt keine rolle spielen, ob ich den Bereich von 1 bis 2 oder von 1 bis 10000 nehme...
 
alkaline hat gesagt.:
dass bei einer variation des Zahlenbereichs die Ergebnisse stark variieren.
Jetzt würd mich doch mal interessieren was an den Ergebnissen variiert.

Ich hab mal folgendes Script ein paar Dutzend mal aufgerufen:

PHP:
echo "<pre>";
$gerade = 0;
$ungerade = 0;
for($i=1; $i<500; $i++){
   $zufall = mt_rand(1,9999);
   ($zufall%2==0) ? $gerade++ : $ungerade++;
   echo sprintf("%s ", $zufall);
   ($i%20==0) ? print "\n" : "";
}
echo "\n\n".$gerade." gerade Zahlen";
echo "\n\n".$ungerade." ungerade Zahlen\n";
echo "</pre>";
Egal wie hoch der Zahlenbereich war 50, 500, 5000, 9999 oder 2, die Verteilung lag im Großen und Ganzen immer zwischen 1:1 und 2:3.
Je höher die for-Schleife eingestellt war desto näher ging die Verteilung gegen 1:1, was ja auch logisch ist.
 
Zuletzt bearbeitet:
Und bei modulo 2 dürfte es wie gesagt keine rolle spielen, ob ich den Bereich von 1 bis 2 oder von 1 bis 10000 nehme...

Es spielt sehr wohl eine Rolle, ob der Bereich von 1-2 oder von 1-10 geht.
Wenn du das vergleichst, dann lasse dir bei 1-2 5x soviel Ergebnisse ausgeben, wie bei 1-10, ...dann hast du eine reellere Vergleichsbasis.
 
Zurück