Zufälligen Index ohne Wiederholungen zurückgeben

Es gibt die Indices 0,1,…,n-1 (weil es ein n-elementiges Array gibt).

Nun soll wiederholt ein zufälliger Index bestimmt werden, der noch nicht vorkam.

Wenn alle Indices „gezogen“ wurden, soll wieder aus allen Indices gewählt werden.

Frage: Was wäre der beste Weg, um dies in Java umzusetzen? Auch hinsichtlich einer akzeptablen Laufzeit bei vielen Elementen.

Mal aus der Hüfte geschossen…

class RandomIndexer{
  private final List<Integer>  availableIndexes = new LinkedList<>();
  private final int elementCount;
  public RandomIndexer(int elementCount){
    this.elementCount = elementCount;
  }
  public int getRandomIndex(){
    if (availableIndexes.isEmpty()){
       initializeIndexes();
    }
    return availableIndexes.remove(0);
  } 
  private void initializeIndexes(){
     availableIndexes.addAll(IntStream.range(0, elementCount)
                                      .mapToObject(Integer::valueOf)
                                      .collect(Collectors.toList()));
     Collections.shuffle(availableIndexes);
  }
}

Bleibt natürlich die Frage, warum Du nicht einfach Collections.shuffle() auf die Liste anwendest, aus der Du zufällig Elemente ziehen willst…

bye
TT

Glaube, du hast die Eingangsfrage nicht/nicht richtig gelesen.

Tschüss, ce

Beleidigt, weil Dích jemand auf Dein Primitive Obsession hin weist?
Oder ist Die nur new LinkedList(Arrays.asList(array)) unbekannt?

bye
TT

Ich bin nicht beleidigt, zumal meine Implementierung so ähnlich ist, aber mit weniger Variablen und Methoden auskommt.

War nur etwas „angefressen“, weil ein einfaches „Collections.shuffle()“ natürlich nicht ausreicht.

Es gibt 1000 Wege, das zu lösen. Wo da nun ‚primitives‘ relevant sind, weiß ich nicht (indizes sind halt int…). Was an einem shuffle „nicht ausreicht“ ist unklar. Vielleicht wäre reservoir sampling was?

1 Like

(Beitrag vom Verfasser gelöscht)

Das, was du zum „nicht ausreicht“ geschrieben (und dann wegeditiert/gelöscht) hast, ist durch das, was Timothy_Truckle geschrieben hat, abgedeckt. Darüber hinaus wäre es - egal, wie der Kern-Ansatz der Lösung aussieht - immer erreichbar durch ein for (....) { ... nowStartAgain(); }. Und auch wenn man sich (bei dir) denken können sollte, dass man seine Zeit nicht nur mit der eigentlichen Beantwortung der Frage, sondern auch mit dem Erwähnen solcher absoluten Banalitäten verschwenden muss, sollte dir klar sein, dass solche Threads wie dieser hier dich einer Sperre näher bringen, auch wenn du vielleicht hoffst, duch geheuchelten Inhaltsbezug den Eindruck erwecken zu können, du könntest dich in einer sinnvollen Form an einem sinnvollen Thread beteiligen.

:eyes:

3 Likes

Noch mal die Anforderungen:

  1. Aus einer Menge 0,1,…,n sollen wiederholt Elemente gezogen werden
  2. Die Elemente sollten zufällig gezogen werden
  3. Das gleiche Element soll nicht wiederholt gezogen werden können
  4. Wenn alle Elemente einmal gezogen wurden, sollen wieder alle Elemente erneut gezogen werden können
    4.1. Dabei sollen die Elemente aber nicht genau in der gleichen Reihenfolge wie zuvor gezogen werden

Ist das jetzt klar?


Das ist Dummfug, weil natürlich genau ein einfaches shuffle() nicht ausreicht. Wenn jemand etwas Dummes schreibt, sollte das auch noch gesagt werden dürfen.

Und zwar unabhängig davon, ob das gegen Marcos „Meinungsdiktatur“ verstößt oder nicht.

Ich erwähne das jetzt einfach extra noch mal. @Timothy_Truckle bisherige Antwort ist deplatziert.

BTW:

Die genannten Anforderungen sind durch das, was Timothy_Truckle geschrieben hat, erfüllt. Nun könnte man sagen, dass da ja nicht einfach shuffle aufgerufen wird, sondern mehrfach (und ich mache auch manchmal solche Kommentare - aber eher im humoristischen Sinne). Und ich könnte mir die Mühe machen, deine letzten beiden Beiträge zu löschen. (Und würde das auch tun, wenn Timothy_Truckle das wünschte). Aber … ich lasse sie jetzt einfach mal stehen, damit alle sehen können, wie du dich (mal wieder) selbst zum Affen gemacht hast, und warum du (mal wieder) gesperrt wurdest.

1 Like

Nö, lass mal, ich sehe das wie Du…

bye
TT