Zufallszahlen Ohne Wiederholung

  • VB.NET

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Zufallszahlen Ohne Wiederholung

    Ich weis das diese Frage schon unendlich oft gestellt wurde. Haber haber leider nichts gefunden was mir hilft (leider)

    Also ich will ein Quiz Programmieren. Die Fragen hol ich mir aus einem .txt file und setze sie in eine Collection.
    Nun will ich per Buttonklick ne Zufällige Frage auswählen.
    Diese Frage darf aber nur einmal kommen > Wenn alle Fragen durch sind soll ne Meldung erscheinen.
    Tja und da ist das Problem. Wie bekomme ich es hin?

    Ich versteh auch iwie den ganzen Code der Zufallszahlen ohne Wiederholung macht nicht ganz durch. Wäre Nett wenn einer Ausführlich erklären könnte was der macht.

    Benutzt habe ich den Code

    VB.NET-Quellcode

    1. Dim a(Fragen.Count - 1) As Integer
    2. For i As Integer = 1 To Fragen.Count
    3. a(i - 1) = i
    4. Next
    5. Dim r As New Random
    6. Dim b() As Integer = (From i As Integer In a Order By r.NextDouble Select i Take 1).ToArray
    7. lbl_Frage.Text = b(b.Count - 1)


    Leider verstehe ich diesen Code nicht ganz. Was bedeutet den diese zeile genau:

    VB.NET-Quellcode

    1. Dim b() As Integer = (From i As Integer In a Order By r.NextDouble Select i Take 1).ToArray


    Und wie mach ich das ganze... geht das in einer Function? also so:

    VB.NET-Quellcode

    1. Private Function Zufall() As Integer
    2. Dim z As Integer 'z soll die Zufallszahl sein die ich dann im Button code ausgeben kann
    3. 'hier steht der Code der für die Zufallszahl ohne wiederholung steht
    4. Return z
    5. End Function


    Wenns geht mal genau erklären wie ich da vorgehen muss. Will den Code selber schreiben können (wenn ichs verstanden habe, was ich machen muss)

    Lerning by Doing!
    Beispiel:

    VB.NET-Quellcode

    1. Dim Rndm = New Random ' Random-Objekt zum Generieren der Zahlen erzeugen
    2. Dim Lst = New List(Of Integer) ' Liste, in der die schon verwendeten Zahlen gespeichert werden sollen.
    3. Dim Top = 10, Bottom = 0 ' höchste und niedrigste Zahl (Top wird nie erreicht, höchstens Top - 1)
    4. While Lst.Count < (Top - Bottom) ' während in der Liste weniger Elemente als Top - Bottom (in unserem Fall 10) sind
    5. Dim Num = 0 ' Variable, in der die generierte Zahl gespeichert wird, deklarieren
    6. Do ' führe Folgendes aus
    7. Num = Rndm.Next(Bottom, Top) ' Num eine zufällige Zahl zwischen 0 (Bottom) und 9 (Top - 1) zuweisen.
    8. Until Not Lst.Contains(Num) ' bis Num nicht in der Liste der bereits generierten Zahlen ist
    9. ' Aktionen
    10. Lst.Add(Num) ' Num zur Liste hinzufügen, so dass es nicht nochmal generiert werden kann
    11. End While
    Diese Frage darf aber nur einmal kommen > Wenn alle Fragen durch sind soll ne Meldung erscheinen.

    Die Frage ist: wir würdest du dies ohne PC lösen? Die Zeile, die du nicht verstehst, ist aus einem Beispiel von Picoflop, der eine Lösung für eine Lottoziehung gezeigt hat.
    Bei der Lottoziehung werden auch keine Zahlen doppelt gezogen. Warum ist das so?

    BTW:

    VB.NET-Quellcode

    1. Dim b() As Integer = (From i As Integer In a Order By r.NextDouble Select i Take 1).ToArray

    Diese Zeile nimmt sämtliche Zahlen aus "a", sortiert sie nach Zufall (Mischt sie also), und nimmt dann ein Element heraus. Die Variable 'i' dient dazu, dass man die jeweilige Zahl innerhalb dieses Konstrukts weiterverwenden kann.
    Die Umwandlung in ein Array entzieht sich meinem Verständnis.
    Dieses Konstrukt fällt unter die Kategorie "LINQ".
    Ist die Variable "Fragen" zufällig eine List? Dann kannst du die Fragen ganz einfach sortieren. Erstelle dazu einfach einen neuen Comparer, also eine Klasse die das Interface "IComparer" implementiert. Hier mal ein Beispiel wie ein Comparer aussehen kann, der in einer Zufallsreihenfolge sortiert:

    VB.NET-Quellcode

    1. Imports System.Collections.Generic
    2. Friend Class RandomComparer
    3. Implements IComparer(Of Object)
    4. Private _Random As New Random
    5. Public Function Compare(x As Object, y As Object) As Integer Implements System.Collections.Generic.IComparer(Of Object).Compare
    6. If _Random.Next(100) >= 50 Then
    7. Return 0
    8. Else
    9. Return 1
    10. End If
    11. End Function
    12. End Class


    Das ganze lässt sich dann so verwenden:

    VB.NET-Quellcode

    1. Fragen.Sort(New RandomComparer)
    ich glaub dassis so nicht anwendbar, also das mit dem Take 1 versteh ich nicht. Ich würd so probieren:

    VB.NET-Quellcode

    1. Dim fragen() As String = "aasd bbb cccc dddd eeee ffff gggg hhh iiiiiiii jjjj kkkk".Split
    2. Dim r As New Random
    3. Dim gemischteFragen = (From s In fragen Order By r.NextDouble).ToArray