hiho,
tja, wie schon der titel andeutet, wie kann man eine liste von elementen zufällig umsortieren lassen (mischen) ?
Ist ein anderer Container evtl. sinnvoller (möglicherweise mit einem vector und dann über indexzugriff)?
mfg TLF
hiho,
tja, wie schon der titel andeutet, wie kann man eine liste von elementen zufällig umsortieren lassen (mischen) ?
Ist ein anderer Container evtl. sinnvoller (möglicherweise mit einem vector und dann über indexzugriff)?
mfg TLF
tja, wie schon der titel andeutet, wie kann man eine liste von
elementen zufällig umsortieren lassen (mischen) ?
Über die Liste direkt nur sehr umständlich. Ein recht einfacher Ansatz wäre z.B., alle Listenelemente in einen std::vector zu stopfen, eine Permutation aller Elemente zu bestimmen und dann nach dieser Permutation eine neue Liste zu erzeugen. Wenn das zufällige Mischen allerdings ein hauptsächlicher Zweck der Struktur ist, solltest du nmochmal überlegen, ob eine Liste der richtige Container ist.
Eine andere spontane Idee wäre, std::list::sort mit einem instabilen (sprich: zufälligen) Prädikat auf die Liste anzusetzen. Ob das terminiert kann ich jetzt allerdings auf die Schnelle nicht sagen.
thx
mal sehen, ob das mit dem zufälligen attribut funktioniert
danke,
tlf
Hi TLF,
es gibt in der STL einen Algorithmus random_shuffle der genau das macht, was Du möchtest, funktioniert allerdings nur mit Random-Access-Iteratoren, somit nur für vector oder deque geeignet, z.B.:
#include
#include
#include
#include
using namespace std;
void main(void)
{
std::vector v(10);
for(size\_t i=0; i(cout,'\n'));
}
hmm, probiert und funktioniert: toll !
kann man den zufallsgenerator noch mit einem anderen seed einstellen?
thx TLF
Hi TLF,
es gibt 2 Versionen des Algorithmus, siehe auch hier:
http://www.sgi.com/tech/stl/random_shuffle.html
Bei der 2. Version kannst Du einen eigenen RandomGenerator übergeben. Die 1.Version benutzt wahrscheinlich (je nach Implementierung) den CRT-Pseudo-Zufallszahlen-Generator (int ::rand(void)). Wenn dem so ist, kannst Du mittels
srand( (unsigned)time( NULL ) );
einen neuen seed setzen (am Anfang des Programms, einmalige Initialisierung). Du kannst aber auch in den Code des algorithmus rein-debuggen, und schauen welcher RandomGenrator benutzt wird, oder am besten gleich selbst einen schreiben, der die Einmal-Initialisierung automatisch durchführt (z.B. durch initialisierung einer statischen Member-Variable).
Gruss Rolf