Random doppelte zahlen vermeiden

hallo,

sagen wir es gibt 100 Witze in einer Datenbank

per klick auf den Button Random bekommt der user mit der mt_rand funktion einen zufälligen witz angezeigt (zahl1 = Witz 1,…=.

Wie kann ich nun verhindern, dass ein Witz doppelt angezeigt wird?

ich dachte an sowas:
-per cookie speichern welche schon gesehen wurde und wenn die rand funktion eine zahl auspuckt, die bereits angeschaut wurde ne neue zahl generieren
-Per session Speichern was gesehen wurde und wenn die rand funktion eine zahl auspuckt, die bereits angeschaut wurde ne neue zahl generieren

oder gäb es noch andere bessere Methoden?

schon mal danke.

Mfg

Man sollte zunächst überlegen, ob sowas überhaupt nötig ist. Wie hoch ist die Wahrscheinlichkeit, dass es passiert - und wie hoch die „Dramatik”?

Man könnte zunächst alle IDs in ein Array einlesen, per shuffle durchmischen, und in der Session ablegen. Und dann „zieht” man bei jedem weiteren Aufruf einen, in dem man das erste Element des Arrays entfernt und damit den Witz abruft.
Das würde garantieren, dass der Nutzer alle 100 Witze je ein mal angezeigt bekommt - bevor es ggf. von vorne losgeht.

Aber das ein Nutzer wirklich alle 100 Witze durchklickt, wie wahrscheinlich ist denn das? Nach einer handvoll oder einem Dutzend hat man von sowas doch meist genug.
Und dafür so einen Aufwand zu betreiben, erscheint mir unverhältnismässig. Wenn ein Witz zum zweiten Mal kommen sollte - dann klickt man halt „weiter”, und schaut sich den nächsten an.

Das machst du am besten wie eine Random-Playlist bei einem Musik-Player. Du generierst zuerst ein Array mit indizes:

$idx = range(0, $count-1);
shuffle($idx);

range: at2.php.net/manual/de/function.range.php
shuffle: at2.php.net/manual/de/function.shuffle.php

Dieses Array speicherst du dann in einer Session und rufst die Witze ab:

while($id = array_pop($_SESSION['idx'])) {
  echo $joke[$id];
}

array_pop: at2.php.net/manual/de/function.array-pop.php

Wenn das ganze DB-gestützt laufen soll, ist das nicht die beste Methode, das ginge schneller :wink: