Problem mit Rnd( )

  • VB.NET

Es gibt 20 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Problem mit Rnd( )

    Dim Spieler1 as Integer
    Spieler1 = 0
    Spieler1 = (5 * Rnd()) + 1
    My.Computer.FileSystem.WriteAllText(My.Settings.Speicherpfad & "Data/Spielerwert/001/1.ini", Spieler1, False)

    das klappt irgenwie nicht der zeigt dann im Textdokument immer nur 5 an

    picoflop schrieb:

    In dem Fall erzeugt dein Rnd() Befehl auch das gewünschte Ergebnis.

    Wenn ich die Wahl habe, einen Trabbi oder einen Benz zu nehmen, seh ich mich bestimmt nicht nach einem Fahrrad um.
    Die alten Sachen führen irgendwann zu üblen Fehlern.
    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!
    Das Klappt trotzdem nicht

    VB.NET-Quellcode

    1. If Label3.Text = "Spieler 2 kann jetzt beitreten." Then
    2. Spieleranzahl = My.Computer.FileSystem.ReadAllText(My.Settings.Speicherpfad & "Data/Spieleranzahl/001/1.ini")
    3. Sp11 = My.Computer.FileSystem.ReadAllText(My.Settings.Speicherpfad & "Data/Spielerwert/001/1.ini")
    4. Spieler24 = My.Computer.FileSystem.ReadAllText(My.Settings.Speicherpfad & "Data/Spielerwert/001/2.ini")
    5. cmdStart.Visible = True
    6. If Spieleranzahl = 2 Then
    7. Do
    8. Spieler24 = New Random().Next(1, 2)
    9. Loop While Spieler24 = Sp11
    10. My.Computer.FileSystem.WriteAllText(My.Settings.Speicherpfad & "Data/Spielerwert/001/2.ini", Spieler24, False)
    11. My.Computer.FileSystem.WriteAllText(My.Settings.Speicherpfad & "Data/Sp2connected/001/1.ini", "2", False)
    12. ElseIf Spieleranzahl = 3 Then
    13. Do
    14. Spieler24 = New Random().Next(1, 3)
    15. Loop While Spieler24 = Sp11
    16. My.Computer.FileSystem.WriteAllText(My.Settings.Speicherpfad & "Data/Spielerwert/001/2.ini", Spieler24, False)
    17. My.Computer.FileSystem.WriteAllText(My.Settings.Speicherpfad & "Data/Sp2connected/001/1.ini", "2", False)
    18. ElseIf Spieleranzahl = 4 Then
    19. Do
    20. Spieler24 = New Random().Next(1, 4)
    21. Loop While Spieler24 = Sp11
    22. My.Computer.FileSystem.WriteAllText(My.Settings.Speicherpfad & "Data/Spielerwert/001/2.ini", Spieler24, False)
    23. My.Computer.FileSystem.WriteAllText(My.Settings.Speicherpfad & "Data/Sp2connected/001/1.ini", "2", False)
    24. ElseIf Spieleranzahl = 5 Then
    25. Do
    26. Spieler24 = New Random().Next(1, 5)
    27. Loop While Spieler24 = Sp11
    28. My.Computer.FileSystem.WriteAllText(My.Settings.Speicherpfad & "Data/Spielerwert/001/2.ini", Spieler24, False)
    29. My.Computer.FileSystem.WriteAllText(My.Settings.Speicherpfad & "Data/Sp2connected/001/1.ini", "2", False)
    30. End If
    31. End If
    32. End Sub


    Dort kommen auch abunzu die gleichen Zahlen zur Stande
    Es kommen auch immer nur Zahlen zwischen 0 und 2
    Du verwendest die Random Klasse ja auch falsch:
    - New Random verwendet man 1x am Anfang um eine neue Pseudo-Zufallszahlen Folge zu erzeugen ( analog Randomize)
    - bei Random.Next(Z1,Z2) wird eine Integer Zahl zwischen Z1 und Z2 erzeugt, wobei allerdings Z2 nie erreicht wird

    VB.NET-Quellcode

    1. Public Class Form1
    2. Dim rnd As New Random
    3. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    4. ' erzeuge Zufallszahl zwischen 1 und 4(!)
    5. MessageBox.Show(rnd.Next(1, 5).ToString)
    6. End Sub
    7. End Class


    Ansonsten sieht Dein Code noch sehr optimierungsfähig aus *hust*

    @pico: too late old man

    picoflop schrieb:

    19Marci96 schrieb:

    zwischen 0 und 2

    0 KANN nicht kommen ... !!!
    Außerdem sollst/darfst du nicht JEDESMAL "New Random()" machen!
    Hau dir in die Klasse eine private Variable "r" mit "private r as new random" rein. Und dann verwendest du diese Instanz


    Das muss ich aber, denn ich bin ein Kartenspiel am Programieren, das Nennt sich Durak, und jeder Spieler muss per Zufallsgenerator einen wert Zugewiesen bekommen wann er immer dran ist, und nich jeder Spieler kann den Selben Wert haben.

    Er zeigt mir aber immer im Textdukoment an, dass eine 0 Vorkommt

    19Marci96 schrieb:

    Das muss ich aber, denn ich bin ein Kartenspiel am Programieren, das Nennt sich Durak, und jeder Spieler muss per Zufallsgenerator einen wert Zugewiesen bekommen wann er immer dran ist, und nich jeder Spieler kann den Selben Wert haben.

    Liest Du gelegentlich eigentlich Antworten bevor Du postest, oder ignoriierst Du diese grundsätzlich ?

    New Random nur 1x verwenden . Was war daran unklar ?

    picoflop schrieb:

    0 KANN nicht kommen ... !!!

    Kann schon, und zwar ausschliesslich dann wenn KEINE seiner If Abfragen zum Zuge kommt, also 5 > Spieleranzahl < 2 ist. Um so etwas festzustellen gibt es den Debugger.

    Dieser ganze Code mit seinen Do ...Loop kann sowieso umgangen werden, wenn man am Anfang der Runde (?) eine Sequenz von sich nicht wiederholenden Zufallszahlen berechnet. Entsprechende Methoden gibt es in diesem Thread: Zufallszahlen ohne wiedeholung
    Mein ihr so wie hier:

    VB.NET-Quellcode

    1. If Spieleranzahl = 2 Then
    2. Do
    3. Spieler24 = New Random().Next(1, 3)
    4. Loop While Spieler24 = Sp11
    5. My.Computer.FileSystem.WriteAllText(My.Settings.Speicherpfad & "Data/Spielerwert/001/2.ini", Spieler24, False)
    6. My.Computer.FileSystem.WriteAllText(My.Settings.Speicherpfad & "Data/Sp2connected/001/1.ini", "2", False)
    7. ElseIf Spieleranzahl = 3 Then
    8. Do
    9. Spieler24 = New Random().Next(1, 4)
    10. Loop While Spieler24 = Sp11
    11. My.Computer.FileSystem.WriteAllText(My.Settings.Speicherpfad & "Data/Spielerwert/001/2.ini", Spieler24, False)
    12. My.Computer.FileSystem.WriteAllText(My.Settings.Speicherpfad & "Data/Sp2connected/001/1.ini", "2", False)
    13. ElseIf Spieleranzahl = 4 Then
    14. Do
    15. Spieler24 = New Random().Next(1, 5)
    16. Loop While Spieler24 = Sp11
    17. My.Computer.FileSystem.WriteAllText(My.Settings.Speicherpfad & "Data/Spielerwert/001/2.ini", Spieler24, False)
    18. My.Computer.FileSystem.WriteAllText(My.Settings.Speicherpfad & "Data/Sp2connected/001/1.ini", "2", False)
    19. ElseIf Spieleranzahl = 5 Then
    20. Do
    21. Spieler24 = New Random().Next(1, 6)
    22. Loop While Spieler24 = Sp11
    23. My.Computer.FileSystem.WriteAllText(My.Settings.Speicherpfad & "Data/Spielerwert/001/2.ini", Spieler24, False)
    24. My.Computer.FileSystem.WriteAllText(My.Settings.Speicherpfad & "Data/Sp2connected/001/1.ini", "2", False)
    25. End If
    26. End If
    27. End Sub

    19Marci96 schrieb:

    ich den Code nochmal umschreiben muss

    Das ganze soll doch wohl zum "üben" sein, oder? Dein ganzer Code ist schließlich dermaßen daneben, dass es ja nur darum gehen kann, dass du das ganze im Laufe der Zeit (des Lernens) so aufhübscht, dass einem nicht gleich das Frühstück hochkommt, wenn man den Code sieht?

    Und bitte nicht folgende Begründung: "Funktioniert doch!"