Zufallsgenerator, doppelte Zahlen vermeiden

  • VB.NET

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von Kabelsalat.

    Zufallsgenerator, doppelte Zahlen vermeiden

    Hallo :) ,

    also ich habe ein Programm geschrieben was besteht aus:
    einem Timer, 6 Textboxen und einem Zufallsgenerator.

    In einer Sekunde läuft der Zufallsgenerator und fängt bei Textbox1 an den Wert reinzuschreiben, das ganze geht dann bis Textbox6 und läuft 6 Sekunden.

    Sieht toll aus und funktioniert. Nur manchmal erscheinen halt Zahlen doppelt. Aber jede der sechs Zahlen darf nur einmal vorkommen.

    Ich denke für die meisten erfahrenen Benutzer hier ist der Code sowieso nicht optimal. Gibt es dennoch eine Möglichkeit das noch zu ändern ohne groß umschreiben zu müssen?

    Danke :)


    VB.NET-Quellcode

    1. Public Class Form1
    2. Dim zufallsgenerator As New Random
    3. Dim lottozahl As Integer
    4. Dim zeit As Integer = 6
    5. Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
    6. If zeit = 6 Then
    7. lottozahl = zufallsgenerator.Next(1, 50)
    8. TextBox1.Text = lottozahl
    9. zeit = zeit - 1
    10. ElseIf zeit = 5 Then
    11. lottozahl = zufallsgenerator.Next(1, 50)
    12. TextBox2.Text = lottozahl
    13. zeit = zeit - 1
    14. ElseIf zeit = 4 Then
    15. lottozahl = zufallsgenerator.Next(1, 50)
    16. TextBox3.Text = lottozahl
    17. zeit = zeit - 1
    18. ElseIf zeit = 3 Then
    19. lottozahl = zufallsgenerator.Next(1, 50)
    20. TextBox4.Text = lottozahl
    21. zeit = zeit - 1
    22. ElseIf zeit = 2 Then
    23. lottozahl = zufallsgenerator.Next(1, 50)
    24. TextBox5.Text = lottozahl
    25. zeit = zeit - 1
    26. ElseIf zeit = 1 Then
    27. lottozahl = zufallsgenerator.Next(1, 50)
    28. TextBox6.Text = lottozahl
    29. zeit = zeit - 1
    30. Else
    31. Timer1.Enabled = False
    32. End If
    33. End Sub
    34. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    35. Timer1.Enabled = True
    36. End Sub
    ich habe grad keine zeit und habe mir nur die Überschrift angeguckt .. Wenn du doppelte Zahlen vermeiden willst,
    machste einfach ne Liste ala int bzw. float und wenn eine zahl generiert wurde setzte die darein...
    Und bei jedem generieren überprüfst du ob die Zahl bereits existiert ... Wenn ja, dann ne neue machen und reinschreiben in die Liste, wenn nein gleich reinschreiben
    Hey,

    hier mal ein Beispiel mit Ganzzahlen.

    VB.NET-Quellcode

    1. Option Strict On
    2. Imports System.Random
    3. Module Module1
    4. Dim rand As New Random
    5. Sub Main()
    6. For b As Integer = 0 To 200 ' 200 Zahlen generieren
    7. Gen()
    8. Next
    9. Console.ReadLine()
    10. End Sub
    11. Private Sub Gen()
    12. Dim generated As New List(Of Integer)
    13. Dim Zahl As Integer = rand.Next(1, 2000000) ' 1 ist in diesem Fall die kleinste generierbare Zahl und 2.000.000 die größt generierbare. Kannste natürlich anpassen.
    14. If Not generated.Contains(Zahl) Then
    15. generated.Add(Zahl)
    16. Console.WriteLine(Zahl)
    17. Else
    18. Console.WriteLine(">> Zahl bereits einmal generiert! Generiere nun neue.")
    19. Gen()
    20. End If
    21. End Sub
    22. End Module
    Die Frage hatten wir schon des öfteren und wie üblich sind die bislang gegebenen Antworten [censored]

    Im Prinzip ist es ein Einzeiler:

    dim r = from p in ienumerable.range(1,6) order by new system.guid select p

    Man kanns auch "schöner" machen, aber beide obigen Ansätze sind natürlich Quark
    Mach es so:

    VB.NET-Quellcode

    1. Dim rr As New Random
    2. Dim a() As Integer = {0, 1, 2, 3, 4, 5}
    3. Dim b(5) As Integer
    4. For i As Integer = 0 To 5
    5. b(i) = rr.Next(10000)
    6. Next
    7. Array.Sort(b, a)
    a ist ein sortiertes Feld, b ist ein zufälliges Feld.
    Wenn b sortiert wird, wird a mit sortiert, woraus dann eine zufällige Reihenfolge folgt.
    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!