Zufälliges Element einer Liste gesucht

Wie kann ich aus einer Liste ein beliebiges (zufälliges) Mitglied auswählen?
Oder besser gefragt: Welches Datenmodell würdet Ihr hier vorschlagen?

Hintergrund:
An einem Fortbildungskurs [gruppe] nehmen Personen [teilnehmer] teil.
Manchmal muss ein beliebiger für eine Überprüfung ausgewählt werden.

Ich verwende momentan:

static LinkedList gruppe = new LinkedList();

Allerdings gibt es zu einem Teilnehmer ja keinen logischen Vorgänger/Nachfolger, somit verleitet dieses Datenmodell zu „falschen“ Arbeitsweisen.

Hallo erstmal.

Wie kann ich aus einer Liste ein beliebiges (zufälliges)
Mitglied auswählen?

Zufallsgenerator: (a*x+b)mod m
a,b beliebige Variable
x Zählvariable
m max. Anzahl des Felds

HTH
mfg M.L.

Hallo erstmal.

Wie kann ich aus einer Liste ein beliebiges (zufälliges)
Mitglied auswählen?

Zufallsgenerator: (a*x+b)mod m
a,b beliebige Variable
x Zählvariable
m max. Anzahl des Felds

HTH
mfg M.L.

Danke, aber die Problematik liegt nicht am Random().
Sondern: Welches Datenmodell würdet Ihr hier vorschlagen?
(Könnte ja sein, dass es ein Modell gibt, das sogar eine zufälligen Zugriff implementiert.)

Hintergrund:
An einem Fortbildungskurs [gruppe] nehmen Personen [teilnehmer] teil.
Manchmal muss ein beliebiger für eine Überprüfung ausgewählt werden.

LinkedList() ist nicht „richtig“ weil ja keine logische Reihenfolge gibt, somit verleitet dieses Datenmodell zu „falschen“ Arbeitsweisen.

Hallo.

Wie kann ich aus einer Liste ein beliebiges (zufälliges)
Mitglied auswählen?

Zufallsgenerator: (a*x+b)mod m
a,b beliebige Variable
x Zählvariable
m max. Anzahl des Felds

HTH
mfg M.L.

Danke, aber die Problematik liegt nicht am Random().
Sondern: Welches Datenmodell würdet Ihr hier
vorschlagen?

(Könnte ja sein, dass es ein Modell gibt, das sogar eine
zufälligen Zugriff implementiert.)

Hintergrund:
An einem Fortbildungskurs [gruppe] nehmen Personen
[teilnehmer] teil.
Manchmal muss ein beliebiger für eine Überprüfung ausgewählt
werden.

LinkedList() ist nicht „richtig“ weil ja keine logische
Reihenfolge gibt, somit verleitet dieses Datenmodell zu
„falschen“ Arbeitsweisen.

Wie wäre es mit einer Set? Das ist ein Interface, mit dem man Mengen von Elementen darstellen kann. Da gibt es verschiedene implementierende Klassen, z.B. ein HashSet.

Sebastian.

Hallo.

Wie kann ich aus einer Liste ein beliebiges (zufälliges)
Mitglied auswählen?

Welches Datenmodell würdet Ihr hier
vorschlagen?

(Könnte ja sein, dass es ein Modell gibt, das sogar eine
zufälligen Zugriff implementiert.)

Wie wäre es mit einer Set? Das ist ein Interface, mit dem man
Mengen von Elementen darstellen kann. Da gibt es verschiedene
implementierende Klassen, z.B. ein HashSet.

Sebastian.

Set klingt gut, vorallem, weil es keine gleiche doppelt geben kann.
Wie würdest du dann auch ein zufälliges Element zugreifen?

Hallo.

Set klingt gut, vorallem, weil es keine gleiche doppelt geben
kann.
Wie würdest du dann auch ein zufälliges Element zugreifen?

Eine Zufallszahl zwischen 0 und Anzahl Elemente - 1 ermitteln und dann im Iterator der Set soviele Elemente durchlaufen.

Sebastian.

Also doch wieder einzeln durchklettern. So mach ich es mit LinkedList.
Aber auf Set werd ich jedenfalls umsteigen.

Danke

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo Tom,

so hier:

private Teilnehmer getRandomTeilnehmer(Vector v){
if(v == null || v.isEmpty())
return null;

Collections.shuffle(v);
return v.firstElement();
}

Gruß,
Uwe

Hallo Uwe.

so hier:

private Teilnehmer
getRandomTeilnehmer(Vector v){
if(v == null || v.isEmpty())
return null;

Collections.shuffle(v);
return v.firstElement();
}

Wow, das ist eher ein Code-GAU :wink:

(a) Unerwünschter Seiteneffekt
Zum einen veränderst Du damit die übergebene Teilnehmerliste,
was wohl eher nicht gewünscht ist, wenn Du nur mal eben
ein zufälliges Element herausgreifen willst.

(b) Performance-Bug
Für solch eine einfache Operation wie die Auswahl
eines Elements jedesmal die ganze Liste zu sortieren,
führt in realen Anwendungen früher oder später zu
üblen Wartezeiten. Die Laufzeit von Collections.shuffle()
ist linear, d.h. braucht immer länger, je größer Deine
Liste ist. Einen Zufallsindex erzeugen dagegen kostet
immer die gleiche konstante Zeit.

Nix für ungut, aber Dein Code war so gefährlich,
dass ich ihn nicht unkommentiert stehen lassen konnte.
Sonst würde Dein Vika-Motto allzu schnell in Erfüllung gehen:

"The most likely way for the world to be destroyed, 
most experts agree, is by accident. That's where we come in; 
we're computer professionals. We cause accidents." 

Gruß,
-Andreas.

(a) Unerwünschter Seiteneffekt
Zum einen veränderst Du damit die übergebene Teilnehmerliste,
was wohl eher nicht gewünscht ist, wenn Du nur mal eben
ein zufälliges Element herausgreifen willst.

Gut, wenn die Liste unverändert bleiben soll, dann arbeite doch einfach auf einer Kopie.

Abgesehen davon wird jemand, der einen Vector benutzt, kaum Wert legen auf Sortierung.

Ok, Tom hatte eine LinkedList, also haette ich idealerweise der Methode eine LinkedList anstelle des Vectors übergeben, und davon eine Kopie angefertigt. Ich geb’s zu, nachlässig von mir.
Allerdings wäre dann wahrscheinlich dein Kommentar über die Performance noch ausführlicher geworden *grins*

(b) Performance-Bug
Für solch eine einfache Operation wie die Auswahl
eines Elements jedesmal die ganze Liste zu sortieren,
führt in realen Anwendungen früher oder später zu
üblen Wartezeiten. Die Laufzeit von Collections.shuffle()
ist linear, d.h. braucht immer länger, je größer Deine
Liste ist. Einen Zufallsindex erzeugen dagegen kostet
immer die gleiche konstante Zeit.

Sicher ist der Zufallsindex performanter. Dafür ist die Benutzung von Collections.shuffle

a) schneller implementiert vom Programmierer
b) und hält den Code lesbarer

Und wenn die Anwendung nicht grade auf 'nem 286er mit 12Mhz und 640k läuft, sollte die Benutzung von Collections.shuffle anstelle eines Zufallsindex nicht auffallen.

Nix für ungut, aber Dein Code war so gefährlich,
dass ich ihn nicht unkommentiert stehen lassen konnte.

„Gefährlich“? Aha. Na wenn du meinst.

Gruß,
Uwe