Mathematik Aufgabe simulieren - Verbesserung im PHP Code möglich?

Gladiator6

Erfahrenes Mitglied
Hi

Ich bin nach und nach am PHP erlernen!

Neulich hatten wir in der Schule eine Mathaufgabe, die lautete folgendermassen:

Wie gross ist die Wahrscheinlichkeit, dass wenn man 52 Karten mischt, mindestens 2 Karten "8" nebeneinander sind. Die Berechnung ergab, dass in 21.79% mindestens 2 Karten nebeneinander sind.

Ich habe nun ein Script geschriben, welches das simuliert! Ich komme ziemlich genau auf diesen Wert, somit ist das Script wohl in Ordnung. Da ich jedoch noch im Anfänger Stadium bin, interessiert es mich, was ich am Programm noch besser machen könnte. Es ist alles auf meinem eigenen Mist gewachsen!

Hier das Script!

PHP:
<?php

$versuche=$_POST["versuche"];
if($versuche==0)
$versuche=1;

$anzahl1=0; // Wie oft keine Karten nebeneinander sind! (Am Anfang 0)
$anzahl2=0; // Wie oft mindestens 2 Karten nebeneinander sind! (Am Anfang 0)

//Anzahl Versuche!

for($z=1; $z<=$versuche; $z++)
{

//Array definieren, mit 52 Karten (Zahlen 1-13. jede Zahl 4 mal)

$karten=array(1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,6,6,6,6,7,
7,7,7,8,8,8,8,9,9,9,9,10,10,10,10,11,11,11,11,12,12,12,12,13,13,13,13);

//Karten (Array) mischen

shuffle($karten);

//Die Positionen, wo die 4 Karten "8" vorkommen, in ein neues Array schreiben.

$positionen=array_keys($karten,8);

//Array nach Grösse Sortieren

array_multisort($positionen);

//Anzahl Karten, die nebeneinander sind! (Am Anfang 0)

$anzahl=0;

//Für die 4 Positionen der Karte schauen, ob sie nebeneinander sind!

for($i=0; $i<=4; $i++)

{
if($positionen[$i+1]==$positionen[$i]+1)
{
$anzahl=$anzahl+1;
}
}

//Versuche ermitteln, wo mindestens 2 Karten nebeneinander sind!
switch($anzahl)
{
case "0":
$anzahl1=$anzahl1+1;
break;

case "1":
$anzahl2=$anzahl2+1;
break;

case "2":
$anzahl2=$anzahl2+1;
break;

case "3":
$anzahl2=$anzahl2+1;
break;

case "4":
$anzahl2=$anzahl2+1;
break;
}
}

$total=$anzahl1+$anzahl2;
$prozent=(100/$total)*$anzahl2;
// Ergebnis ausgeben!
echo"<br>";
echo"Total Versuche: $total<br>";
echo"Anzahl keine Karten nebeneinander:$anzahl1<br>";
echo"Anzahl Karten nebeneinander:$anzahl2<br>";
echo"<br>";
echo"In $prozent Prozent sind mindestens 2 Karten nebeneinander!";
?>

Verbesserungsvorschläge? Nur her damit :D
 
PHP:
//Versuche ermitteln, wo mindestens 2 Karten nebeneinander sind!
switch($anzahl)
{
case "0":
$anzahl1=$anzahl1+1;
break;

case "1":
$anzahl2=$anzahl2+1;
break;

case "2":
$anzahl2=$anzahl2+1;
break;

case "3":
$anzahl2=$anzahl2+1;
break;

case "4":
$anzahl2=$anzahl2+1;
break;
}
}

$total=$anzahl1+$anzahl2;
$prozent=(100/$total)*$anzahl2;

Das kannst ein wenig abkürzen da Dich nur 2 Zustände interessieren , einmal wenn $anzahl1 == 0 ist und einmal wenn nicht.

PHP:
if($anzahl === 0){
    $anzahl1++;
}else{
    $anzahl2++;
}

$total=$anzahl1+$anzahl2;
$prozent=(100/$total)*$anzahl2;

mir hat das mal keine Ruhe gelassen und ich hab fix ne eigene Version gebastelt ;) Aber Mathe war noch nie so meine Stärke , der Wert schwankt so zwischen 21.9x% und 24% bei 10.000 Durchläufen. Könnte man auch noch alle auffangen und davon den Durchschnitt berechnen nun *G*

PHP:
<?php
$karten = array();
$durchgänge = 10000;
$anzahl = 0;

//Array mit Daten füllen
for($i = 1 ; $i <= 13 ; $i++){
    for($j = 0 ; $j<4;$j++){
		$karten[] = $i;
	}
}

for($j = 0 ; $j < $durchgänge ; $j++){
	//array mischen
	shuffle($karten);

	for($i = 0;$i < (count($karten)-1) ;$i++){
		if($karten[$i] == 8 && $karten[$i] == $karten[$i+1]){
		    $anzahl++;
		}
	} 
}

echo (($anzahl*100)/$durchgänge)."%";
?>
 
Zuletzt bearbeitet:
Werde mir das ganze heute Abend genauer anschauen!

Ich bekomme bei 10 Millionen Versuchen einen Wert, der auf 2 Kommastellen genau dem mathematisch errechneten Wert entspricht!

Lustig ist noch folgendes:

Wenn ich das Script auf dem Lokalen Server ausführe, sind die Werte ganz leicht höher, als wenn ich es auf dem Webserver ausführe!
 
Des weiteren hab ich festgestellt das die Funktion array_keys() besser ist als alle Werte miteinander zu prüfen.

Ich glaube zumindest das das Script schneller läuft wenn man sich direkt die Schlüssel rauszieht wo eine "8" liegt und diese dann überprüft.
Bei 100000 hat er schon ein wenig gewürgt bei meiner Version und pendelte sich dann so auf einen Wert von ~23% ein also immerhin ~1.3% zuviel irgendwie. Aber dann hab ich es bleiben lassen da es dabei blieb und sich nicht mehr änderte , selbst nach ~30 versuchen.
Das oberste Script kommt dabei nicht über die 23% Marke hinaus irgendwie.
 
Zurück