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 18
-
-
void 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++) {
-
}
-
}
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 18
-
-
void 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++) {
-
}
-
}
Weitere nützliche Members von “algrorithm” findet ihr hier.
Solltet ihr Fragen oder Anregungen haben -> Kommentar (-:
Gruß Dimitri