Namen Random bestimmen lassen?

  • VB.NET

Es gibt 16 Antworten in diesem Thema. Der letzte Beitrag () ist von Unwesen.

    Namen Random bestimmen lassen?

    Hallo,

    ich muss gleich dazusagen: Ich habe mir nicht alle von den oben genannten Links komplett angucken können!


    ich hatte heute die Idee, ein Programm zu erstellen, dass per Zufall einige Personen (in meinem Fall 28) zu einer Gruppe zuordnet und in einer oder mehreren RichtTextBoxen ausgibt. Das Grundkonzept steht, jedoch ist das Problem: Die Random-Auswahl.


    Kann mir da jemand ein paar Tipps geben oder (falls das Thema schon mal behandelt wurde) einen Link zum Thema senden?


    Mit freundlichen Grüßen


    Pierre
    Pack die entsprechenden Namen in ein Feld oder eine List(Of String) und berechne Dir einen zufällligen Index.
    Das Feld / List dieses Index' ist dann der zufällige String, mit dem Du tun kannst, was Dir beliebt.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Oder was immer Du willst, was Du über einen Index zugreifen kannst.
    Feld oder eine List(Of String) sind nicht sichtbar, ListBox ist ggf. sichtbar.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Hieraus dürftest du etwas entsprechendes basteln können
    Spoiler anzeigen


    !!! CODE ARBEITET FEHLERHAFT, BERICHTIGUNG STEHT UNTEN !!!


    VB.NET-Quellcode

    1. Public Class Form1
    2. Dim rn As New Random
    3. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    4. End Sub
    5. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    6. If IO.File.Exists(My.Computer.FileSystem.SpecialDirectories.Desktop & "\namensliste.txt") Then
    7. Dim namen() As String = IO.File.ReadAllLines(My.Computer.FileSystem.SpecialDirectories.Desktop & "\namensliste.txt")
    8. For i As Integer = 0 To namen.Length - 1
    9. Dim zf As Integer = rn.Next(0, namen.Length)
    10. If Not ListBox1.Items.Contains(namen(zf)) Then
    11. ListBox1.Items.Add(namen(zf))
    12. End If
    13. Next
    14. End If
    15. End Sub
    16. End Class



    namensliste.txt
    Spoiler anzeigen

    Quellcode

    1. Dilara
    2. Jill
    3. Mariella
    4. Leona
    5. Janne
    6. Alissa
    7. Maren
    8. Alexa
    9. Henriette
    10. Jenna
    11. Giulia
    12. Mina
    13. Selin
    14. Laila
    15. Aleyna
    16. Felicitas
    17. Svenja
    18. Alisa
    19. Alena
    20. Lene
    21. Leticia
    22. Denise
    23. Mona
    24. Lenja
    25. Lilian
    26. Judith
    27. Elina
    28. Anny
    29. Anni
    30. Annie
    31. Marieke
    32. Aliyah
    33. Aaliyah
    34. Ina
    35. Juliana
    36. Stefanie
    37. Stephanie
    38. Evelyn
    39. Evelin
    40. Eveline
    41. Jamie
    42. Marleen
    43. Cheyenne
    44. Josy
    45. Josie
    46. Rosa
    47. Joline
    48. Nadine
    49. Tessa
    50. Christin
    51. Kristin
    52. Lotte
    53. Madita
    54. Noemi
    55. Joy
    56. Valentina
    57. Tuana
    58. Ela
    59. Veronica
    60. Veronika
    61. Mareike
    62. Alessia
    63. Leyla


    //EDIT
    Mist, eben erst bemerkt, das die Anzahl der Ausgabe (ListBox1) nicht mit der der Eingabe (Namensliste) übereinstimmt.

    Der folgende Code arbeitet korrekt:

    VB.NET-Quellcode

    1. Public Class Form1
    2. Dim rn As New Random 'Zufallszahlengenerator
    3. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    4. Dim ListenPfad As String = My.Computer.FileSystem.SpecialDirectories.Desktop & "\namensliste.txt" 'Pfad zur Namensliste
    5. If IO.File.Exists(ListenPfad) Then 'Wenn Datei existiert...
    6. Dim Namen() As String = IO.File.ReadAllLines(ListenPfad) 'Lade die einzelnen Zeilen in ein Array
    7. Dim Zähler As Integer = 0
    8. Do While Zähler < Namen.Length 'solange Zähler kleiner als Arraygröße..
    9. Dim tmpZufall As Integer = rn.Next(0, Namen.Length) 'neue Zufallszahl zw. 0 und Arraygröße (plus 1)
    10. If Not ListBox1.Items.Contains(Namen(tmpZufall)) Then 'wenn Eintrag noch nicht vorhanden..
    11. ListBox1.Items.Add(Namen(tmpZufall)) 'füge der Listbox den Namen hinzu
    12. Zähler += 1 'erhöhe Zähler um 1
    13. End If
    14. Loop
    15. MsgBox(Namen.Length & " - " & ListBox1.Items.Count) 'Kontrolle; Anzahl stimmt überein
    16. End If
    17. End Sub
    18. End Class

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Unwesen“ ()

    Ein wenig Arbeit solltest Du schon selbst erledigen.
    Ansonsten: Lerne die Grundlagen.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Lösung:
    Alle Personen in eine "Liste" (List(of wasauchimmer)). Liste durcheinanderwürfeln (Forensuche: Fisher Yates). Anzahl Personen durch Anzahl Gruppen teilen (Ganzzahlig! -> X). X in die erste Gruppe, x in die zweite Gruppe, usw. Dann bleiben welche über. 1 in die erste Gruppe, 1 in die 2. Gruppe etcbis alle weg sind.

    Alternativ:
    Nach dem durchmischen der Liste: Erste Person in erste Gruppe, Erste Person aus Liste löschen. NEUE erste Person in zweite Gruppe usw. Wenn man in der letzten Gruppe ist, setzt man den Gruppenindex zurück bzw verwendet GrupIndx = (GrupIndx + 1) MOD Gruppenzahl
    Ich würde die dumme Frage gerne nicht stellen müssen, jedoch komme ich weder bei Google noch hier im Forum zu einem passenden Ergebnis unter dem Suchbegriff "Fisher Yates" ;( Naja, guck ich mal, wie ich das anstelle.

    ErfinderDesRades schrieb:

    Pierre schrieb:

    Öhm, sorry, aber kann ich dafür einfach eine Listbox verwenden oder wie?

    Eine Listbox ist doch 100mal komplizierter als eine List(Of String)
    Wie gesagt: Ich finde kein Steuerelement mit dem Namen...

    picoflop schrieb:

    Pierre schrieb:

    jedoch komme ich weder bei Google noch hier im Forum zu einem passenden Ergebnis unter dem Suchbegriff "Fisher Yates"

    strange ...

    [VB 2008] Quiz programmieren (Zufallsfragen)
    Achso... Ich habe das nicht so identifizieren können.
    Funktioniert das auch mit 2010?
    Das funktioniert auch mit VB6 und sogar QuickBasic, da sind genau NULL komplizierte Befehle drin, das würde man aber erkennen, wenn man sich den Code angeschaut hat und ein klein wenig Grundahnung von VB hat.

    Ansonsten, einfach ausprobieren, was ist daran so schwer? Mit ausprobierne ob das funktioniert, würdest das viel eher wissen als hier auf Antworten zu warten.

    Wie gesagt: Ich finde kein Steuerelement mit dem Namen...


    Nun nicht alles was es in VB.NET gibt besteht aus Steuerelementen, es gibt ein haufen an Klassen die man einfach so benutzt, das wenigste sind Steuerelemente, das ist ja auch gut so, denn eine List(of ...) benötigt keine User Interaktionen, es stellt einfach eine Liste von irgendeinem Typ dar, wie ein Array, nur besser zu handhaben.
    Wenn du sowas nicht kennst, dann hilft dir Google oder speziell MSDN weiter msdn.microsoft.com/de-de/library/6sh2ey19.aspx