C sharp Zufallgenerator mit Namen?

LugicoHDPlayer  29.04.2020, 15:39

Nur damit ich es richtig verstehe: Du hast eine Liste mit 9 Namen drin und willst 4 davon ausgeben, aber nicht zweimal den gleichen?

Timooo149 
Fragesteller
 29.04.2020, 15:47

Korrekt

4 Antworten

Hallo!

Wenn Du diese Zufallszahlen erzeugst, dann schreibe diese in eine eigene Liste.

Und jedes mal fragst Du diese Liste ab, ob die neu generierte Zufallszahl bereits in dieser Liste existiert, oder nicht.

Dann wird diese neue Zahl entweder dieser Liste hinzu gefügt, oder einfach eine neue Zufallszahl erzeugt.

Und diese Liste dient dann als Index für die Namensliste, die sortiert, oder unsortiert vorliegen kann.

Damit fragst Du dann einfach die Namensliste ab.

Und weil die Reihenfolge Zahlen in der Index-Liste zufällig sind, wird auch die Reihenfolge der ausgegebenen Namen entsprechend unsortiert ausfallen.

Du musst lediglich darauf achten, ob Du den Index bei "0", oder "1" starten lässt. Entsprechend muss der Gültigkeitsbereich für die Zufallszahlen gewählt werden.

So kannst Du auch problemlos aus einer beliebig langen Namensliste eine entsprechend beliebige Anzahl an zufällig ausgewählten Namen erzeugen.

Dieses Vorgehen sollte grundsätzlich in jeder Programmiersprache funktionieren.

Die "Ausarbeitung" des Codes in C# überlasse ich Dir.

Ich kenne diese Sprache nämlich nicht weiter, obwohl ich sie wahrscheinlich teilweise ein "klein wenig" lesen und entsprechend "deuten" könnte.

Gruß

Martin

Hiermit lässt sich ein zufälliges Element einer Liste auswählen

var random = new Random();
var list = new List<string>{ "one","two","three","four"};
int index = random.Next(list.Count);
Console.WriteLine(list[index]);

Wenn du die Liste später nichtmehr vollständig benötigst, könntest du einfach jedes mal, nachdem du ein Element "gezogen" hast, das Element aus der Liste löschen:

list.RemoveAt(index); 

Solltest du die Liste noch brauchen, kannst du auch eine Liste mit den bereits gezogenen Namen machen und das nächste mal überprüfen, ob du das Element schon gezogen hast, indem du überprüfst, ob es schon in der "gezogen" Liste vorhanden ist


var random = new Random();
List<string> list = new List<string>{"one","two","three","four"};
List<string> gezogen = new List<string>(); 
for (int i=0; i<4; i++) {
  int index = random.Next(list.Count);
  if (!gezogen.Contains(list[index])) {
    gezogen.Add(list[index]);
    Console.WriteLine(list[index]);
  }
}
Timooo149 
Fragesteller
 29.04.2020, 16:04

RemoveAt wird bei mir rot makiert

0
LugicoHDPlayer  29.04.2020, 16:21
@Timooo149

Also hier ist ein Link zu den Microsoft Docs über List<T>.RemoveAt
https://docs.microsoft.com/de-de/dotnet/api/system.collections.generic.list-1.removeat?view=netcore-3.1

Hier ein Link zum Compilerfehler CS1061
https://docs.microsoft.com/de-de/dotnet/csharp/language-reference/compiler-messages/cs1061

Angeblich gibt es also diese Funktion "RemoveAt" garnicht. Eventuell hast du sie Falsch geschrieben. Oder hast du eventuell den Namen deiner Liste falsch geschrieben. bei

list.RemoveAt(index) 

muss list der name deiner Liste sein. Hoffe ich konnte weiterhelfen

1

Moin,

das kannst Du mit verketteten Listen umsetzen und die gezogenen Namen entfernen.

Alternativ kannst du vor Ausgabe überprüfen ob der Name schon gezogen wurde (Wobei dies die ineffizientere Methode sein dürfte, je größer die Schnittmenge an vorhandenen Namen und gezogenen Namen ist.)

MfG Souta

Woher ich das weiß:Studium / Ausbildung
  1. Gezogene Elemente aus der Liste entfernen
  2. Gezogene Elemente markieren
  3. Neue Liste mit gezogenen Elementen, dann vorher mit List.Contains prüfen
Timooo149 
Fragesteller
 29.04.2020, 15:48

Wie geht das?

0
codinghelp  29.04.2020, 15:49
@Timooo149

Wie geht was? Elemente Löschen? List.Remove

Hinzufügen? List.Add

1