Robert Bamler: Zufallsauswahl ohne Wiederholung

Beitrag lesen

Hallo Simon,

ich verstehe zwar nicht ganz, wo genau dein Problem liegt (programmier halt einfach das, was du erreichen willst), aber mir ist vor kurzem eine IMHO sehr elegante Lösung zu diesem "Mischvorgang" begegnet. Die ist nämlich auch bei größeren Arrays sehr performant (z.B. beim Mischen von Karten):

Du hast ein Array ("erstesArray"), in dem die ganzen Einträge stehen, die gemischt werden sollen. In einem zweiten Array ("zweitesArray") hast du nur Referenzen auf diese Einträge, nämlich die Indizis der zu mischenden Einträge. Dieses Array ist genauso groß wie das erste und enthält am Anfang einfach die Zahlen von 0 bis n-1. Es reicht, wenn du nur das zweite Array mischt, weil jedem Eintrag im zweiten Array eindeutig ein Eintrag im ersten Array zugeordnet ist und umgekehrt. Dann machst du folgendes:

for (i=0; i<zweitesArray.length-1; i++) {
  zufallszahl = Zufallsgenerator(zweitesArray.length-i) + i;
  zwischenspeicher = zweitesArray[zufallszahl];
  zweitesArray[zufallszahl] = zweitesArray[i];
  zweitesArray[i] = zwischenspeicher;
}

Dann hast du im Array "zweitesArray" die Zahlen von 0 bis n-1 in gemischter Reihenfolge. Auf die eigentlichen Einträge kannst du zugreifen mit erstesArray[zweitesArray[index]].

Viel Erfolg,
Robert