Visal Basic Zufallsgenerator erstellen

  • VB.NET

Es gibt 12 Antworten in diesem Thema. Der letzte Beitrag () ist von FormFollowsFunction.

    Visal Basic Zufallsgenerator erstellen

    Hallo ihr lieben. Also wie gesagt ich habe sowas noch nie gemacht. Darum ist es sehr schwer für mich das umzusetzen. Ich plane ein Turnier und brauche für die Auslosung einen Zufallsgenerator. Tatsächlich habe ich es geschafft einen zu erstellen. Sogar so, das die Namen der Teams erscheinen. Leider kommt der Zufall immer wieder und die Teams stehen doppelt oder dreifach da. Kann man den Code so ändern, das wenn ein Team raus ist, dieses auch nicht mehr im Generator ist?

    Thema verschoben ~VaporiZed

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „VaporiZed“ ()

    Hallo und Willkommen im Forum

    Grammy00 schrieb:

    Kann man den Code so ändern

    Wie sollen wir das wissen. Du hast keinerlei Code gepostet. Ist das absicht oder ein Fehler?

    Du musst uns schon was geben.
    Ein paar Fragen (nur falls der Code diese nicht durch sich selbst beantwortet) - geht es wirklich um VBA?
    Wenn ja, in welcher Umgebung? Excel, Access, Word, Powerpoint, usw.

    Du musst dich in die Lage der Helfenden versetzen. Nun lese deinen Beitrag nochmal und überlege ob DU dich auskennen würdest wenn du NUR diesen Post als Info hast. Ich denke du weist was ich meine.
    Bitte Poste also deinen bisherigen Code und eine belastbare Aufgabenstellung.

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Grammy00 schrieb:

    Kann man den Code so ändern, das wenn ein Team raus ist, dieses auch nicht mehr im Generator ist?
    Kann man bestimmt. Aber dazu müsste man den Code kennen. Ich würde die bereits ermittelten Teams in eine Liste schreiben und bei der nächsten Auslosung dort schauen ob das ermittelte Team bereits in der Liste vorhanden ist. Falls ja, wird nochmal ausgelost.
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    Danke für die Antwort. Ich habe ja gesagt, das ich mich damit leider nicht auskenne. Darum hier erstmal der Code:

    VB.NET-Quellcode

    1. Dim Zahl As Integer
    2. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    3. Dim Rnd As New Random
    4. Zahl = Rnd.Next(0, 4)
    5. If Zahl = 1 Then
    6. MsgBox("GBB")
    7. ElseIf Zahl = 2 Then
    8. MsgBox("Bat")
    9. Else Zahl = 3
    10. MsgBox("IGN")
    11. End If
    12. End Sub
    13. End Class


    Es sind aktuell bewusst nur 3 Teams darin, weil ich mich selber damit erstmal teste. Ich würde das auch selber nicht machen, wenn ich eine alternative Software gefunden hätte. Darum kann ich auhc nicht sagen, ob es eine blöde Frage ist oder sonst was.

    Wenn ihr sonst irgendwelche infos braucht, versuche ich diese natürlich zu geben.

    *CodeTags eingefügt* ~NoFear23m
    CodeTags korrigiert ~VaporiZed

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

    Willkommen im Forum.

    Antwort von VaporiZed (User):

    Dim Rnd As New Random sollte außerhalb der Sub stehen. Es reicht vollkommen aus, den einmal zu initialisieren. Der tut auch dann seine Arbeit. Aus Deiner Problembeschreibung habe ich noch nicht ermitteln können, was das genaue Ziel ist. Geht es darum, verschiedene Teams gegeneinander antreten zu lassen und da kommt es vor, dass GBB gegen GBB antritt, also gegen sich selbst?

    Grammy00 schrieb:

    Leider kommt der Zufall immer wieder und die Teams stehen doppelt oder dreifach da


    Oder dass irgendein Team rausfliegt und dann trotzdem noch in der nächsten Runde auftaucht?

    Grammy00 schrieb:

    Kann man den Code so ändern, das wenn ein Team raus ist, dieses auch nicht mehr im Generator ist?


    Grundsätzlich brauchst Du erstmal ne Liste von Teams. Ich gehe davon aus, dass wir hier nicht bei VBA, sondern bei VB.Net sind (s. unten). Also brauchst Du z.B. eine List(Of X). Ob X jetzt String oder gleich eine ganze Klasse bleibt Dir und Deinen Programmierkenntnissen überlassen. Damit kannst Du festlegen, welche Teams der Zufallsgenerator auswählen kann (Listenindex), da Du der Liste Teams hinzufügen kannst und auch wegnehmen kannst. Ob Du Ergebnis-Duplikate durch einen entsprechenden Zufallsalgorithmus oder per einfachen If-Test verhinderst, musst Du selber entscheiden.







    Antwort von VaporiZed (Moderator): Ändere bitte den Titel des Threads so, dass man die Problematik erkennen kann. Die Boardregeln besagen:

    Boardregeln schrieb:


    3. Aufmachung
    a) Beiträge im Forum müssen immer einen aussagekräftigen Titel haben.
    Ein Titel wie "Bitte helft mir!" oder "Ich komme nicht weiter" ist absolut nichtssagend und erschwert anderen Usern die Zuordnung des Beitrages (um welches Thema es geht).

    Auch fehlt noch Deine Antwort auf die in Post#2 gestellten Fragen:

    Nofear23m schrieb:

    geht es wirklich um VBA?
    Wenn ja, in welcher Umgebung? Excel, Access, Word, Powerpoint, usw.
    Alternativ: Wenn Du in Visual Studio unterwegs bist (und Handles Button1.Click erhärtet diese Vermutung), dann gib bescheid. Dann können wir den Thread entsprechend anpassen.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Ja es geht um Visial Studio.

    Wie gesagt bin Anfänger und habe null Plan davon. Vlt hat jemand Zeit und Lust, sich mal im TS zu treffen und zu quatschen. Denke dann ist es einfacher zu erklären.

    Es soll Quasi ausgelost werden aus 16 Teams, wer geben wen spielt. Darum dürfen die Teams eben auch nicht doppelt kommen.
    @Grammy00 Ganz einfach.
    Befüll ein List(Of Integer) mit den Zahlen von 1 bis 16.
    Mit dem Zufallsgenerator holst Du eine Zahl von 0 bis Anzahl - 1 und verwendest sie als Index des zu entfernenden Elements der Liste.
    Das entfernte Element packst Du in eine neue Liste.
    Wenn alle Elemente gezogen wurden, sind in der neuen Liste die Zahlen 1 bis 16 zufällig aufgelistet.
    Feddich.
    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!
    Die eleganteste mir bekannte Shuffle-Methode:

    Pack alle Mannschaften in eine List(Of String). Oder auch List(Of WasImmerDuWillstObjekt).
    Im nachstehenden Code nenne ich sie OriginalList.

    VB.NET-Quellcode

    1. Dim rnd = New Random()
    2. Dim RandomizedList = OriginalList.OrderBy(Function(x) rnd.Next()).ToList

    So kriegst du eine Zufallsliste und kannst jetzt aufeinanderfolgende Paare gegeneinander spielen lassen.
    Erster gegen Zweiter, Dritter gegen Vierter, Fünfter gegen Sechster usw.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „petaod“ ()

    Öhm, danke. Ist in Post#5 verlinkt und im genannten Link auch dort erklärt. :P
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Ich habe mir interessehalber eine anderen Ansatz erdacht.
    Ich hole mir aus der List(Of String)
    Ein zufälliges Item und lösche es dan aus der Liste.

    VB.NET-Quellcode

    1. Private Function GetRandomTeam() As String
    2. Dim randomIndex As Integer = Random.Next(TempTeams.Count)
    3. Dim team As String = TempTeams(randomIndex)
    4. TempTeams.RemoveAt(randomIndex)
    5. Return team
    6. End Function

    Angewendet wird die Methode in einer Schleife, bis die Liste leer ist.
    Zwei Team Namen werden jeweils zusammen in eine Klasse (VersusPair) geschaufelt, so hat man dann die Paarungen immer beisammen.

    VB.NET-Quellcode

    1. Private Sub Mix()
    2. If Not IsEven(Teams.Count) Then
    3. Throw New Exception("'Teams.Count' must be even.")
    4. End If
    5. TempTeams.AddRange(Teams)
    6. Dim result As New List(Of VersusPair)
    7. Do Until TempTeams.Count = 0
    8. result.Add(New VersusPair(GetRandomTeam, GetRandomTeam))
    9. Loop
    10. UpdateDataGridView(DataGridView1, result)
    11. End Sub
    Nur zur Sicherheit: TempTeams ist wahrscheinlich auch ne klassenweite List(Of String) und wird ... irgendwo noch geleert? Denn Codeblock#2, Zeile#5 spricht von AddRange. Und da sollte die Liste ja leer sein, damit keine Duplikate dann bei GetRandomTeamrauskommen. Ach, Mix() wird wahrscheinlich nur 1x aufgerufen und dann wird alles einmalig durchgemischt. Alles klar. (Glaub ich zumindest)
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Ja, genau richtig erfasst, ich wollte aber (vorerst) keine c&p Lösung posten.

    @Grammy00
    Dein code hat einen derben Logig Fehler !
    Wenn Paarungen entstehen sollen, bleibt bei eine ungraden Zahl an Teams, natürlich eins übrig.
    Also entweder muß der pool an teams eine grade Anzahl haben,
    oder du musst in der Programmlogig beachten, daß ein team übrig bleibt.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „FormFollowsFunction“ ()