Zufälliges Bild anzeigen

Ich will auch!

Das ganze bin ich mal mathematisch angegangen und habe einen Restklassenring (mod Anzahl Elemente) genutzt:
PHP:
session_start();
$pictures = array('logo_mann.jpg', 'logo_ngk.jpg', 'logo_hella.jpg');

// Restklassenring modulo Anzahl der Elemente (Mächtigkeit / Kardinalität)
$anzahl = count($pictures);

// Neue Zahl = (Alte Nummer + Zufallswert) modulo Mächtigkeit
$_SESSION['nr'] = ($_SESSION['nr'] + rand(1, $anzahl - 1)) % $anzahl;

Restklassenring? Was passiert hier?

Zerlegen wir das einmal:
Zu der in der Session gespeicherten Nummer wird eine Zufallszahl addiert.
Da man damit über die Anzahl der Elemente hinaus gelangt wird anschließend durch die Anzahl geteilt und der REST ermittelt (per %).

Beispiele für ein Array mit 5 Elementen [jeweils: (Alte Nummer + Zufallswert) modulo 5] :
(0 + 3) % 5 = 3 % 5 = Rest 3
(3 + 1) % 5 = 4 % 5 = Rest 4
(4 + 3) % 5 = 7 % 5 = Rest 2, weil 7 durch 5 = 1 Rest 2
usw.

Damit nicht die selbe Zahl wie zuvor rauskommt, darf der Zufallswert nicht der Anzahl der Elemente entsprechen. Beispiel, wenn ein Array 5 Elemente hätte und die Zufallszahl ebenfalls 5 ist:
(4 + 5) % 5 = 9 % 5 = 4

Das ist nicht erwünscht, daher ist das Maximum der Zufalls Zahl um einen kleiner als die Anzahl der Elemente: $anzahl - 1.

Ebenfalls unerwünscht ist wenn nichts addiert wird, da dies den gleichen Effekt hätte. Also ist die Untergrenze der Zufallszahl 1, woraus folgt: rand(1, $anzahl - 1).

Unsere alte Zahl: $_SESSION['nr']
Die zu addierende Zufallszahl: rand(1, $anzahl - 1)
Wie hoch man maximal gehen darf: $anzahl = count(das_Array)

So kommt man auf diesen kleinen sehr schnellen Algorithmus.

Geht es denn nicht noch schneller?
Natürlich! Aber nur wenn die Anzahl der Elemente 2^n - 1 entspricht. In diesem Fall lässt sich ein bitweises UND statt der Modulorechnung verwenden:
PHP:
$_SESSION['nr'] = ($_SESSION['nr'] + rand(1, $anzahl - 1)) & $anzahl;
 
Zuletzt bearbeitet:
Zurück