| PHP Developer Forum Hier habt ihr die Möglichkeit, eure Skriptprobleme mit anderen Anwendern zu diskutieren. Seid so fair und beantwortet auch Fragen von anderen Anwendern. Dieses Forum ist sowohl für ANFÄNGER als auch für PHP-Profis! Post your PHP questions here! |
 |
|

17-04-2010, 20:58
|
|
Winti
Registrierter Benutzer
|
|
Registriert seit: Apr 2010
Beiträge: 9
|
|
Zufallszahlen nicht normal verteilt
Stehe gerade vor folgendem Problem:
Ich simuliere einen Würfelwurf und ermittle die Häufigkeit der jeweils geworfenen Zahl. Dabei werden zwar schön alle Zahlen von 1 bis 6 geworfen ( $wurf=rand(1,6); ) aber wenn ich das in einer Schleife sich z.B. 600 mal wiederholen lasse kommen immer erstaunlich wenig Einsen dabei raus, alle anderen Zahlen erscheinen gleichmäßig verteilt, nur die Eins ist immer der absolute Ausreisser nach unten.
Das der Befehl nicht korrekt ist scheint mir ja eigentlich unmöglich, schliesslich wird ja (ab und zu) eine Eins geworfen, nur eben nicht wie eigentlich erwartet alle Zahlen so um die 100 mal sondern immer nur ca 20 Einsen und der Rest (wie erwartet) gleichmäßig verteilt auf Zweier bis Sechser ! Die Summe aller Häufigkeiten ist auch immer genau 600, so dass auch eine fehlerhafte Ermittlung der Häufigkeiten ausgeschlossen werden kann.
Versuche mit mt_rand brachten keine Änderung und auch srand() blieb wirkungslos.
Rohcode:
PHP-Code:
<?php
$anzahl1=0; $anzahl2=0; $anzahl3=0; $anzahl4=0; $anzahl5=0; $anzahl6=0;
for ($i=1;$i<=600;$i++) { $zahl=rand(1,6); if ($zahl==1) {$anzahl1=$anzahl1+1;} if ($zahl==2) {$anzahl2=$anzahl2+1;} if ($zahl==3) {$anzahl3=$anzahl3+1;} if ($zahl==4) {$anzahl4=$anzahl4+1;} if ($zahl==5) {$anzahl5=$anzahl5+1;} if ($zahl==6) {$anzahl6=$anzahl6+1;} }
echo "<h1>Häufigkeiten</h1> <table> <tr> <td>1er</td> <td>2er</td> <td>3er</td> <td>4er</td> <td>5er</td> <td>6er</td> </tr> <tr> <td>$anzahl1</td> <td>$anzahl2</td> <td>$anzahl3</td> <td>$anzahl4</td> <td>$anzahl5</td> <td>$anzahl6</td> </tr> </table>"; ?>
Hat jemand einen Schimmer was da falsch laufen könnte ????
|

17-04-2010, 21:00
|
|
combie
PHP Expert
|
|
Registriert seit: May 2006
Beiträge: 2.925
|
|
versuchs mal mit mt_rand()
|

17-04-2010, 21:10
|
wahsaga
 Moderator
|
|
Registriert seit: Sep 2001
Beiträge: 24.486
|
|
Problem nicht nachvollziehbar, der gezeigte Code liefert eine Gleichverteilung im zu erwartenden Rahmen.
Auf was für einem System läuft PHP bei dir, und welche Version?
__________________
I don't believe in rebirth. Actually, I never did in my whole lives.
|

17-04-2010, 21:11
|
|
Winti
Registrierter Benutzer
|
|
Registriert seit: Apr 2010
Beiträge: 9
|
|
keine Änderung
hatte ich ja schon ausprobiert, reagiert genauso falsch !
ich habe mal aufgezeichnet, was hier z.B. bei 50*600 Durchgängen rauskommt:
PHP-Code:
Runde 1er 2er 3er 4er 5er 6er 1 21 117 119 105 114 124 2 21 111 111 129 117 111 3 27 126 111 113 100 123 4 16 116 106 120 127 115 5 16 125 102 133 120 104 6 16 126 115 107 117 119 7 11 130 138 85 109 127 8 23 116 121 109 116 115 9 9 116 135 122 124 94 10 20 119 103 124 117 117 11 21 108 133 104 130 104 12 17 110 119 117 126 111 13 16 114 120 101 122 127 14 12 103 109 109 141 126 15 14 128 109 105 112 132 ...
Geändert von TobiaZ (17-04-2010 um 22:58 Uhr)
Grund: Code Umgebrochen
|

17-04-2010, 21:13
|
|
Winti
Registrierter Benutzer
|
|
Registriert seit: Apr 2010
Beiträge: 9
|
|
System
Ich lasse das Ganze direkt über den webserver von hosteurope laufen, hat bislang eigentlich immer tadellos funktioniert.
|

17-04-2010, 21:18
|
|
Winti
Registrierter Benutzer
|
|
Registriert seit: Apr 2010
Beiträge: 9
|
|
mal zum anklicken ;o)
wer möchte kann sich das Ganze auch gerne mal starten:
http://www.winti.de/PHP/wurf.php
|

17-04-2010, 21:29
|
TobiaZ
 Moderator
|
|
Registriert seit: Jan 2001
Ort: MUC und MGL, Germany
Beiträge: 34.188
|
|
Zum Vergleich:
http://php.tobiweb.net/test/wuerfel.php
Bleibt also nur:
Zitat:
Zitat von wahsaga
Problem nicht nachvollziehbar, der gezeigte Code liefert eine Gleichverteilung im zu erwartenden Rahmen.
Auf was für einem System läuft PHP bei dir, und welche Version?
|
EDIT: Mal rein aus Interesse, wie sehen die Zahlen aus, wenn du den Code hier ausführst?
PHP-Code:
<?php
$counter = array(1=>0,0,0,0,0,0);
for ($i=1;$i<=600;$i++) $counter[rand(2,7)]++; ?>
<h1>Häufigkeiten</h1> <table> <tr> <th>Augenzahl</th> <th>Häufigkeit</th> </tr> <?php foreach($counter as $i => $num) echo '<tr><td>' . $i . '</td><td>' . $num . '</td></tr>'; ?> </table>
Probiers auch mal mit anderen Zahlen.
Geändert von TobiaZ (17-04-2010 um 21:40 Uhr)
|

17-04-2010, 22:40
|
|
Winti
Registrierter Benutzer
|
|
Registriert seit: Apr 2010
Beiträge: 9
|
|
geht auch nicht ???
Danke für das Beispiel, bei Dir funktioniert es , na klar ;o)
bei mir (hosteurope) nicht, wie nicht anders zu erwarten :-(
das ist das Ergebnis Deines Programms auf meinem webserver:
Code:
Häufigkeiten
Augenzahl Häufigkeit 1021131224118510761277115
jetzt hoffentlich auch formatiert:
Häufigkeiten
Augenzahl Häufigkeit 1021131224118510761277115
EDIT: by TobiaZ: so wäre es schön formatiert!
Augenzahl Häufigkeit 1 0 / 2 11 / 3 122 / 4 118 / 5 107 / 6 127 / 7 115
Geändert von TobiaZ (17-04-2010 um 22:48 Uhr)
Grund: Postings zusammengeführt & Zahlen auseinander gefriemelt.
|

17-04-2010, 22:42
|
TobiaZ
 Moderator
|
|
Registriert seit: Jan 2001
Ort: MUC und MGL, Germany
Beiträge: 34.188
|
|
Kannst du das Ergebnis bitte vernünftig formatieren?
EDIT: Tipp: Es gibt nen VORSCHAU-Button. Und nutz doch bitte die Editier-Funktion.
EDIT: Habs jetzt mal schön gemacht bei dir.
Also gut, bei dir wird weiterhin die kleinste "Augenzahl" zu selten gewürfelt. Restliche Fragen bleiben weiter offen.
Geändert von TobiaZ (17-04-2010 um 22:50 Uhr)
|

17-04-2010, 22:53
|
|
Winti
Registrierter Benutzer
|
|
Registriert seit: Apr 2010
Beiträge: 9
|
|
sorry
muss mich in diesen Editor erst noch eindenken ;o)
|

17-04-2010, 22:56
|
TobiaZ
 Moderator
|
|
Registriert seit: Jan 2001
Ort: MUC und MGL, Germany
Beiträge: 34.188
|
|
Okay, mehr können wir dann aber jetzt nicht hellsehen... (auch sorry)
|

18-04-2010, 12:52
|
 |
onemorenerd
 Moderator
|
|
Registriert seit: Mar 2005
Ort: Berlin
Beiträge: 9.481
|
|
Wenn du 600 Versuche mit einem 6er Würfel brauchst, aber dein rand() bei 1 kaputt ist, dann mach halt 600/6*7 = 700 Versuche mit einem 7er Würfel. Die 1er Würfe schmeißt du weg und bei den 2-7er Würfen ziehst du 1 von der Augenzahl ab. Dann stimmts doch, oder?
Du könntest natürlich auch gleich von 2 bis 7 Würfeln und 1 abziehen, aber vielleicht ist den rand() nicht bei 1 kaputt sondern beim Beginn des Wertebereichs.
Man muss aber auch mal sagen, dass rand() nicht "von selbst" solchen Murks macht. Dein Provider hat da dran rumgepatcht oder der Zufallsgenerator des OS unten drunter ist schon kaputt.
Geändert von onemorenerd (18-04-2010 um 12:55 Uhr)
|

18-04-2010, 14:24
|
|
Winti
Registrierter Benutzer
|
|
Registriert seit: Apr 2010
Beiträge: 9
|
|
so klappt das nicht ....
weil wenn ich 700 Ziehungen mache und die 1er wegschmeisse ergibt sich keine saubere Normalverteilung. Und auf anderen Webservern ergeben sich ja eben die sauberen Ergebnisse. Also muss das wohl an hosteurope liegen, bei denen läuft irgendwas verkehrt, habe mich bereits mal da gemeldet und um Klärung gebeten, wenn ich eine (hoffentlich klärende) Antwort erhalte werde ich das hier natürlich veröffentlichen.
|

18-04-2010, 15:01
|
|
h3ll
Registrierter Benutzer
|
|
Registriert seit: Mar 2008
Beiträge: 2.328
|
|
Welche PHP-Version läuft da?
|

18-04-2010, 16:00
|
|
Winti
Registrierter Benutzer
|
|
Registriert seit: Apr 2010
Beiträge: 9
|
|
es läuft die PHP-Version 5.2.12, wird vom Script jetzt am Anfang auch ausgegeben:
http://www.winti.de/PHP/wurf.php
|
|
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
|
|
|
| Themen-Optionen |
|
|
| Thema bewerten |
|
|
Forumregeln
|
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.
HTML-Code ist aus.
|
|
|
|
PHP News
|