[PHP] zufallszahl ohne wiederholung

Mike Lowrey

Commodore
Registriert
Juni 2005
Beiträge
4.978
Hallo,

ich bin in php ein relativer neuling habe jedoch für eine website ein paar php funktionen genutzt.

Mein Problem ist:
ich erstelle eine Zufallszahl die geht durch ein gebilde von "if" "elseif" abfragen und soll je nach wert etwas anderes ausgeben
zum schutz vor wiederholungen habe ich eine prüfsumme gemacht die eine wiederholung direkt nacheinander verhindern sollte leider passiert das trotzdem...
nun wäre meine frage ob einer den fehler kennt/findet

PHP:
   <?php

   	$zahl = rand(1,4); // erzeugt die Zufallszahl
		if($zahl == $prüfsumme) // vergleicht die Zufallszahl mit der vorrigen
                 if($zahl == 1)
                 	$zahl = 2;
                 		elseif($zahl == 2)
                 		$zahl = 3;
                         		elseif($zahl == 3)
                 			$zahl = 4;
                         			elseif($zahl == 4)
                 				$zahl = 3;
                 if($zahl == 1) // entscheidet welches Gedicht gewählt wird
			echo "1";
		elseif($zahl == 2)
			echo "2";
		elseif($zahl == 3)
			echo "3";
		elseif($zahl == 4)
			echo "4";
		else
			echo "Error no text found";
		$prüfsumme = $zahl; // erzeugt eine Prüfsumme für eventuelle aktualisierungsvorgänge
?>
Gruß Mike Lowrey

PS: die if verschachtelung ist nicht die beste lösung aber die kenn ich
:)
 
Warum so umständlich ?
Probiers mal mit

mt_srand ((double)microtime()*1000000);
$zufallszahl=mt_rand(1,4);
 
schon einmal danke für die antwort.

könntest du mir das vielleicht noch etwas erklären also warum dabei z.b. keine direkte wiederholung stattfindet?
 
Weil er die Systemzeit als Grundlage für die Zusatzzahl her nimmt.
Ein uralter "Trick"

Mir seit dem C64 bekannt.
 
Hmm ich codier das mal schnell so hin

PHP:
<?php

$zahl = rand(1,4);
if($zahl == $prüfsumme)
{
  if ($zahl == 5) {$zahl = 1;}
  else {$zahl++;}
}

 switch ($zahl) {
case 1:
    echo "1";
    break;
case 2:
    echo "2";
    break;
case 3:
    echo "3";
    break;
 case 4:
    echo "4";
    break;
 }

?>


Kann sein dass noch n paar kleine Fehler drin sind, passt aber grossteils.
Ist so viel übersichtlicher.
Speicher doch einfach die Nummer des letzten Gedichts in nem Cookie.

http://www.webmaster-resource.de/tricks/php/cookie-setzen.php

David

 
Vielen Dank euch!
Werd es gleich mal ausprobieren.


Edit:

@ Relict
Ich habe es gerade damit ausprobiert... leider kommt es immernoch vor das eine direkte Wiederholung statt findet.
 
Zuletzt bearbeitet:
Hallo,

wenn ich das nun richtig verstehe soll bei jedem Aufruf eine Zufallszahl generiert werden, welche jeweils einem Gedicht zugeordnet ist und das ausgegebene Gedicht soll sich immer von dem Gedicht des vorherigen Aufrufs unterscheiden.
Dann könnte dies so aussehen:

PHP:
session_start();

while(1)
{
  $zufallszahl = rand(0, 3);

  if($zufallszahl != $_SESSION["zufallszahl"])
  {
    $_SESSION["zufallszahl"] = $zufallszahl;

    break;
  }
}

$gedichte = array("Mein erstes Gedicht", "Noch ein Gedicht", "Ein drittes Gedicht", "Das letzte Gedicht");

echo $gedichte[$zufallszahl];
MfG mh1001
 
Nochmals vielen dank.

Habe es erstmal mit cookie's gelöst werde mir aber noch die Variante von dir angucken "mh1001"

lg Mike Lowrey

PS: mh1001 du hast es genau richtig verstanden.
 
Achso ja, also wenn 100%-ig immer etwas anders kommen muss, dann ist es ja auch kein Zufall mehr. ;) Bei nur 4 Zahlen ist natürlich die Wahrscheinlichkeit für zufällige Wiederholung höher, als bspw. bei einer Menge aus 100 Zahlen.

Dann machs wie schon gepostet wurde, also random in Verbindung mit cookies, session o.ä.
Auf jedenfall nicht diese ganzen if-Abfragen. Das ist viel zu unflexibel und unübersichtlich. ^^
Wenn es wirklich bei den wenigen Zahlen bleibt, dann könnte man sogar auf den random verzichten und ein einfacher durchlauf würde es dann auch tun ? (in session, cookie oder db immer die vorige Zahl des users speichern und auslesen, um die nächste zu ermitteln)
 
Imo hab ich leider noch die ganzen if verschachtelungen hab damit jetzt erstmal die Cookies zum laufen gebracht.
Das werde ich gleich mal durch "case" ersetzen denke das es der Übersicht ganz gut tun würde.

Es sollte halt schon mehr oder weniger zufällig sein und die Anzahl wird noch steigen für den Anfang dachte ich aber das die Anzahl reicht.
 
Hallo,

du könntest auch ein Array erstellen, in dem alle Zahlen, die schon vorkamen hineingespeichert werden und dann nachher einfach schaust, ob der Wert in dem Array vorhanden ist.

Oder notfalls auch ein Array mit allen Zahlen die vorkommen können sollen und dann immer eines löschen, wenn es vorkommt.

Ich würde aber die erste Option vorziehen...

Gruß
FreeZeY
 
Hm wenn ich das richtig verstanden habe, dann soll einfach immer nur eine andere Zahl hintereinander kommen, also niemals 2 hintereinander. Da könnte man daoch einfach so lösen
PHP:
$stand = 0; // aktuelles Gedicht
$gedicht = array("Gedicht 1", "Gedicht 2", "Gedicht 3", "Gedicht 4");
while(1) // Hier wird immer durchlaufen
{
  $stand = ($stand + rand (1,3))%4;
  echo $gedicht[$stand];
}

Bei jedem Durchlauf wird mindestens eine eins auf den aktuellen Stand addiert, aber maximal 3, alsoein Gedicht vor dem aktuellen. Per Modulo (%) wird das ganze auf maximal 3 gebracht, damit man auf das Array zugreifen kann. Falls das ganze per Reload funktionieren soll, müsste man den aktuellen Stand in ein Cookie, bzw Session tun und den While Part und den $stand = 0; Part rausnehmen
 
Zu dem Array habe ich noch eine Frage:
Kann man auch weiteren php Code in das Array packen?
 
ja klar warum nicht. Dazu ist ja ein array, um mehrere Werte einzutragen. ;)
Bei nicht zusammengehörigen Werten am besten ein assoziativarray oder gleich mehrere arrays ins cookie.

Bedenke aber, der Sinn dieser Zufallsfunktion relativiert sich dadurch nochmals, wenn Du zb. immer die bereits gesehenen Gedicht-IDs oder was auch immer dort abspeicherst. Die verbleibende Zahl Gedichte reduziert sich ja dann jedesmal weiter bis 0, also entsprechende Vorkehrungen treffen. ^^

Ich würde also immer nur das zuletzt gesehene Gedicht überschreiben, nicht alles fortlaufend eintragen.
 

Ähnliche Themen

Zurück
Oben