Immer die selben Zahlen bei Random

  • VB.NET

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

    Immer die selben Zahlen bei Random

    Hallo,

    Ich arbeite momentan recht intensiv an meinem Poker-Spiel und stehe da vor einem Rätsel:
    Zu Beginn einer Spielrunde erhalten alle Spieler zwei Karten. Das funktioniert folgendermaßen:

    VB.NET-Quellcode

    1. 'Random Objekt erstellen
    2. Private _rnd As New Random
    3. For Each p As Player In Players
    4. For i As Integer = 0 To 1
    5. 'Zufallszahl erzeugen; Maximalwert = Anzahl der Karten auf dem Kartenstapel
    6. Dim i As Integer = _rnd.Next(KartenStapel.Count - 1)
    7. 'Der Hand des Spielers die Karte vom Kartenstapel hinzufügen
    8. p.MyHand.Cards.Add(KartenStapel(i))
    9. 'Die ausgewählte Karte vom Kartenstapel entfernen
    10. KartenStapel.RemoveAt(i)
    11. Next
    12. Next

    Das befindet sich übrigens alles in der Round-Klasse, die für jede Runde neu erzeugt wird.

    Nun das Problem: Es wird immer die selbe Zufallszahl erzeugt und ich habe einfach keine Ahnung wieso. Würde ich die Karten nachdem sie ermittelt wurden nicht vom Stapel löschen, bekommen alle Spieler die identischen Karten. Ich bin echt ratlos und ich hoffe mir kann jemand sagen, wieso das so ist und wie man das Problem beheben kann :)

    Vielen Dank schon mal im Vorraus
    Switcherlapp97
    RubiksCubeSolver


    Jetzt im Showroom
    For i= ...
    Dim i = ...
    Next i

    Und das frisst der Compiler??? Meiner nicht!


    Außerdem würde ich es anders lösen:
    Nimm deinen Kartenstapel. "Mische" die Karten, dann tue sie in eine Queue. Damit simulierst du exakt ein "normales" Kartenspiel

    VB.NET-Quellcode

    1. Private Class Spielkarte
    2. End Class
    3. Private mischer As List(Of Spielkarte)
    4. Private Deck As Queue(Of Spielkarte)
    5. Private Sub mischen()
    6. Dim rnd = New Random
    7. Deck = New Queue(Of Spielkarte)(From card In mischer Order By rnd.Next Select card)
    8. End Sub


    BTW: Wenn du per Zufall aus ner List auswählst, MUSST du die Karte natürlich aus der Liste nehmen! Alles andere wäre Falschspiel ... ;)

    Switcherlapp97 schrieb:

    VB.NET-Quellcode

    1. For i As Integer = 0 To 1
    2. 'Zufallszahl erzeugen; Maximalwert = Anzahl der Karten auf dem Kartenstapel
    3. Dim i As Integer = _rnd.Next(KartenStapel.Count - 1)

    Ist dir aufgefallen, dass du i hier zweimal drin hast?
    Weltherrschaft erlangen: 1%
    Ist dein Problem erledigt? -> Dann markiere das Thema bitte entsprechend.
    Waren Beiträge dieser Diskussion dabei hilfreich? -> Dann klick dort jeweils auf den Hilfreich-Button.
    Danke.
    @Gonger96
    Danke schon mal für die Antwort :)

    Zu Beginn sind das logischerweise 52 Karten (hab ich auch nachgeprüft) und bei jeder Karte wirds eben eins weniger :)
    Beim Nachprüfen ist mir allerdings was interessantes aufgefallen: Ich habe immer eine MessageBox anzeigen lassen mit der Anzahl des Kartenstapels. Herausgekommen sind dann verschiedene Karten für die einzelnen Spieler. Kann das daran liegen, dass viele Zufallszahlen in kurzer Zeit generiert werden und deshalb immer das selbe rauskommt?

    @picoflop

    Switcherlapp97 schrieb:

    Würde ich die Karten nachdem sie ermittelt wurden nicht vom Stapel löschen, bekommen alle Spieler die identischen Karten.

    Das ist im Konjunktiv. Wenn du den Code anschaust, siehst du, dass ich die Karten vom Stapel nehme :D Ich probier jetzt mal deine Methode.

    @Arby
    Sorry ist bei mir im Code natürlich anders. Irgendwie ist mir da ein Fehler unterlaufen :wacko:

    Danke für die bisherigen Antworten
    Switcherlapp97
    RubiksCubeSolver


    Jetzt im Showroom

    Switcherlapp97 schrieb:

    Sorry ist bei mir im Code natürlich anders

    Weißt du, was immer Mist ist? Wenn jemand Code postet, der bei ihm so gar nicht steht ...


    Kann das daran liegen,

    Woher sollen wir das wissen, wir kennen deinen Code ja nicht. Das was wir sehen, hat mit deinem Code ja offensichtlich nicht viel zu tun - kompiliert ja noch nicht mal.

    picoflop schrieb:

    Weißt du, was immer Mist ist? Wenn jemand Code postet, der bei ihm so gar nicht steht ...

    Da hast du natürlich vollkommen recht. Ich habe aus dem Code ein paar Passagen rausgenommen, da die für das Problem irrelevant sind und da ist mir irgendwo ein Fehler unterlaufen. Da wird nähmlich noch mehr überprüft bei den Spielern in dieser Schleife. Zum Beispiel wer SmallBlind ist und wer jetzt als erstes setzt usw.

    Ich habe jetzt allerdings deine Lösung jetzt ausprobiert und das funktioniert super!!! :D

    Gruß
    Switcherlapp97
    RubiksCubeSolver


    Jetzt im Showroom
    Moin,

    @Switcherlapp97::
    Der Random-Konstruktor (ohne Parameter) nimmt den aktuellen Zeitstempel. Du rufst deine Funktion so oft auf, dass sich dieser in der Zeit nicht ändert. Die Lösung: Ein Random-Objekt erstellen und es immer wieder verwenden.

    @affrop::
    Die Rnd- und Randomize-Funktionen sind VB6 und sollten nicht mehr verwendet werden.
    Mit freundlichen Grüßen,
    Thunderbolt

    timmi31061 schrieb:

    Du rufst deine Funktion so oft auf

    Würde man bei der Beschreibung vermuten, aber er sagt, "alle Spieler" würden die gleichen Karten bekommen. Und das New Random steht außerhalb der For Each p as Player Schleife.
    NATÜRLICH hat er seinen Code "sinnvoll" gekürzt, so dass man eigentlich gar keine Aussage machen kann ...
    Kopier deinen geposteten Code mal in ein neues Projekt, ersetzt das For Each durch For mit Zähler und sag ob Random gleiche Werte ausgibt. Wenn nein hast du nicht sinnvoll gekürzt, wenn ja hat Microsoft eine Klasse geschaffen die nur auf deinem Computer nicht funktioniert.
    @Gonger96

    Random gibt keine gleichen Werte aus. Ich weiß auch nicht genau an was es bei mir lag, aber ich hab das Random-Objekt wirklich außerhalb der Schleife erstellt. So sieht der ungekürzte Code aus:

    VB.NET-Quellcode

    1. Private Sub PreFlop()
    2. 'Each Player gets two random cards
    3. For Each p As Player In Players
    4. If p.Blind = Player.Blinds.SmallBlind Then
    5. Me.ActivePlayer = p
    6. End If
    7. For i As Integer = 0 To 1
    8. Dim j As Integer = rnd.Next(KartenStapel.Count - 1)
    9. 'Der Hand des Spielers die Karte vom Kartenstapel hinzufügen
    10. p.MyHand.Cards.Add(KartenStapel(i))
    11. 'Die ausgewählte Karte vom Kartenstapel entfernen
    12. KartenStapel.RemoveAt(i)
    13. Next
    14. Next
    15. ActivePlayer.Bet(SmallBlind)
    16. ActivePlayer.Raise(BigBlind)
    17. End Sub

    Und außerhalb habe ich das Random-Objekt erstellt. Was dann rauskommt seht ihr im Anhang. Vielleicht könnt ihr entdecken, was ich nicht sinnvoll gekürzt habe :wacko:

    Gruß
    Switcherlapp97
    Bilder
    • random-problem.png

      2,54 kB, 200×63, 405 mal angesehen
    RubiksCubeSolver


    Jetzt im Showroom
    @Artentus

    Bin ich ein Idiot. An dem ist es die ganze Zeit gelegen. Ich habe die zufallsgenerierte Zahl nicht mal verwendet :D. Tut mir echt leid, dass ich diesen Thread aufgemacht habe und eure Nerven strapaziert habe :S. In diesem Fall ist dieser Thread erledigt.

    Gruß
    Switcherlapp97
    RubiksCubeSolver


    Jetzt im Showroom
    Tut mir leid das sagen zu müssen, aber wenn der Code im Eröffnungspost nicht "sinnvoll" gekürzt worden wäre, hätten wir dir den Fehler schon vor viereinhalb Stunden sagen können... :P
    Weltherrschaft erlangen: 1%
    Ist dein Problem erledigt? -> Dann markiere das Thema bitte entsprechend.
    Waren Beiträge dieser Diskussion dabei hilfreich? -> Dann klick dort jeweils auf den Hilfreich-Button.
    Danke.