Sei es für eine Bildergalerie in der eure Bilder in zufälliger Reihenfolge angezeigt werden sollen oder zufällig ausgewählte User eures neuen, schicken “Web 2.0 Portals” sein, ein Array gefüllt mit sich nicht wiederholenden Zufallszahlen ist euer Freund. (-;
Diese Methode hier hat eine schnieke Laufzeit und leistet mir in meinen Anwendungen gute Dienste.
Ich habe hier im Beispiel simplen C++ Code verwandt.
In PHP könnt ihr dies mit den Array Funktionen “array_pop($arr);” und “array_rand($arr)” deutlich einfacher umsetzen.
Die Idee:
Wir erstellen ein Array gefüllt mit Zahlen von 0 bis MAX, die wir dann in “Unordnung” bringen.
Dabei speichern wir einen zufällig gewählten Wert an das Ende des Arrays weg und beachten im nächsten Schleifendurchlauf nur noch die übrigen Indizes.
Natürlich funktioniert das auch mit anderen “Wunschkandidaten” wie ID’s, Namen, Farben, Trollen etc. …
Der Code:
// Denkt daran time.h zu inkludieren
#include <iostream>
#include <time.h>
#include <cstdlib>// Länge des Array’s m. d. Zufallszahlen; von 0 bis MAX-1
#define MAX 18void main(void){
int i, zufall;// Array erstellen und befüllen 0 bis MAX
int rand_arr[MAX];
for (i = 0; i < MAX; i++)
rand_arr [i] = i;int grenze = MAX – 1;
// Seed für Zufallszahl setzen, hierfür wird >>time.h<< benötigt
srand( (unsigned)time(NULL));
int puffer = -1;while(grenze > 0){
zufall = rand()%grenze+1;
// SWAP zwischen Grenze (Ende des Array’s) und der Zufallszahl
puffer = rand_arr[grenze];
rand_arr[grenze] = rand_arr[zufall];
rand_arr[zufall] = puffer;//Grenze dekrementieren
grenze–;
puffer = -1;
}// ### Anzeigen des Arrays
for(i=0; i <= (MAX – 1); i++)
printf(“%d: %d\n”,i+1,rand_arr[i]);}
Das war es schon!
Eine elegantere und deutlich kürzere Lösung ist unter Verwendung des “algorithm” Headers möglich. Vielen Dank Herrn Grafe an dieser Stelle (-;
Der Code:
#include <algorithm>
#include <time.h>using namespace std;
// Länge des Array’s m. d. Zufallszahlen; von 0 bis MAX-1
#define MAX 18void main(void){
int i;// Array erstellen
int rand_arr[MAX];// Seed setzen um immer-gleiche Zahlenfolgen zu verhindern
srand( (unsigned)time(NULL));// Array befüllen
for (i = 0; i < MAX; i++)
rand_arr [i] = i;// Zufälliges Verstauschen der Elemente im Array
random_shuffle(rand_arr,rand_arr+MAX);// Anzeigen des Arrays
for(i=0; i <= (MAX – 1); i++){
printf(“%d: %d\n”,i+1,rand_arr[i]);
}
}
Weitere nützliche Members von “algrorithm” findet ihr hier.
Solltet ihr Fragen oder Anregungen haben -> Kommentar (-:
Gruß Dimitri