Einmalige Zufallszahl generieren

  • Allgemein

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

    Einmalige Zufallszahl generieren

    Hi

    Ich habe folgendes Problem:

    Ich brauche eine Funktion der ich zwei werte zuweisen kann einen "von" und einen "bis" Wert,
    die Funktion soll nun eine Zufallszahl erstellen, und sie zurückgeben,
    beim zweiten aufruf der Funktion, soll sie prüfen ob sie die Zufallszahl schon mal hatte, wenn nicht dann soll sie die Zahl zurückgeben, andernfalls eine neue Zahl generieren - prüfen, und das geht von vorne los :)

    Hoffe ihr könnt mir helfen :)

    Grüße
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Class FatRandom
    2. Private Random As Random
    3. Private mUpperBound As Integer
    4. Public ReadOnly Property UpperBound() As Integer
    5. Get
    6. Return mUpperBound
    7. End Get
    8. End Property
    9. Private mLowerBound As Integer
    10. Public ReadOnly Property LowerBound() As Integer
    11. Get
    12. Return mLowerBound
    13. End Get
    14. End Property
    15. Private NumberPool As List(Of Integer)
    16. Public ReadOnly Property NumbersLeft() As Integer()
    17. Get
    18. Return NumberPool.ToArray
    19. End Get
    20. End Property
    21. Public Sub New(ByVal LowerBound As Integer, ByVal UpperBound As Integer)
    22. mLowerBound = LowerBound
    23. mUpperBound = UpperBound
    24. Random = New Random
    25. CreateNumbers()
    26. End Sub
    27. Public Sub New(ByVal UpperBound As Integer)
    28. Me.New(0, UpperBound)
    29. End Sub
    30. Public Sub DropNumber(ByVal Number As Integer)
    31. Dim Position As Integer = NumberPool.IndexOf(Number)
    32. If Position > -1 Then _
    33. NumberPool.RemoveAt(Position)
    34. End Sub
    35. Public Function GetNumber() As Integer
    36. Dim Count As Integer = NumberPool.Count
    37. If Count < 1 Then Return Integer.MinValue
    38. Dim Position As Integer = Random.Next(Count)
    39. Return NumberPool(Position)
    40. End Function
    41. Public Function GetExclusiveNumber() As Integer
    42. Dim Count As Integer = NumberPool.Count
    43. If Count < 1 Then Return Integer.MinValue
    44. Dim Position As Integer = Random.Next(Count)
    45. Dim Number As Integer = NumberPool(Position)
    46. NumberPool.RemoveAt(Position)
    47. Return Number
    48. End Function
    49. Private Sub CreateNumbers()
    50. NumberPool = New List(Of Integer)(mUpperBound - mLowerBound)
    51. For i As Integer = mLowerBound To mUpperBound
    52. NumberPool.Add(i)
    53. Next
    54. End Sub
    55. End Class

    Die Klasse einbinden, dann kannst Du z.B. mit

    VB.NET-Quellcode

    1. Dim Rand As New FatRandom(0, 200)

    Einen Zufallsgenerator basteln, der Dir Zahlen zwischen 0 und 200 zurückgibt.

    VB.NET-Quellcode

    1. Rand.NumbersLeft

    Gibt Dir z.B. an welche Zahlen noch nicht gezogen wurden.
    Mit GetNumber kannst Du Dir eine noch nicht gezogene Zufallszahl zurückgeben lassen, mit GetExclusiveNumber erhältst Du auch eine noch nicht gezogene Zufallszahl und diese wird dann auch für zukünftige Abfragen gesperrt.

    Gruß FatFire

    Edit: PS: Bevor jemand rummosert, dass man das Ganze auch performanter und speicherschonender implementieren kann (von wegen BitArray nutzen und so): das weiß ich auch. Aber die Klasse hatte ich zufälligerweise noch rumfliegen.

    picoflop schrieb:

    "Ziehen ohne zurücklegen"?


    hä?

    na ok, ich erklärs mal neu:

    ich programmiere gerade an einem Quiz,
    das Quiz läd alle fragen (den Praf zu den Fragen) in eine listbox.
    nähmen wir mal an ich hätte 11 fragen

    nun soll sich mwin programm einen index aussuchen und die frage laden
    nur wie in jedem echten quiz kommt keine frage doppelt.
    wenn ich jetzt das normale random benutze könnte es möglich sein, das z.B. die frage nummer 5 zwei mal kommt :(

    Grüße
    Ich bin mal so lieb und geb dir eine fertige Funktion, auch wenn ich jetzt als C&P-Geber verschrien werde ;)

    VB.NET-Quellcode

    1. Dim rndFc As New Random()
    2. Dim lstBenutzt As New List(Of Integer)
    3. Function einmaligerZufall(ByVal intVon As Integer, ByVal intBis As Integer) As Integer
    4. Dim intZuf As Integer
    5. Do
    6. intZuf = rndFc.Next(intVon, intBis)
    7. Loop Until Not lstBenutzt.Contains(intZuf)
    8. lstBenutzt.Add(intZuf)
    9. Return intZuf
    10. End Function


    Ist jetzt ohne IDE geschrieben, könnte Fehler enthalten.