schleife mit random??

  • VB.NET

Es gibt 11 Antworten in diesem Thema. Der letzte Beitrag () ist von miko1204.

    schleife mit random??

    hallo leute

    ich versuche mit einer schleife 15 zahlen auf einer listbox zu addieren aber die 15 zahlen von 0 bis 15 sollen nicht immer gleich addiert werden

    also nict immer in der gleichen reihenfolge

    zb:

    0
    1
    2
    3
    4
    ...

    sondern immer verschieden

    zb:

    8
    12
    4
    9
    ...

    dazu benutze ich random 0 fu 15 jedoch passiert es manchmal das die gleiche zahl beim randon vorkommt und das will ich nicht
    ich hab ein code geschrieben

    VB.NET-Quellcode

    1. Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
    2. Dim ran As New Random
    3. Dim zahl As Integer
    4. Dim found As Boolean
    5. For i As Integer = 0 To 15
    6. found = False
    7. zahl = ran.Next(0, 15)
    8. If ListBox1.Items.Count = 0 Then
    9. ListBox1.Items.Add(zahl)
    10. Else
    11. For i2 As Integer = 0 To ListBox1.Items.Count - 1
    12. If ListBox1.Items(i2) = zahl Then
    13. found = True
    14. Exit For
    15. End If
    16. Next
    17. If found = True Then
    18. i = i - 1
    19. Else
    20. ListBox1.Items.Add(zahl)
    21. End If
    22. End If
    23. Next
    24. End Sub


    wenn die gleiche zahl vorkommt moechte ich einfah das i wieder das selbe ist und so wird ich keine 2 gleichen zahlen in der listbox haben kdeoch bleibt das program immer stecken wenn ich aufs button3 clicke ich kriege keine fehlermeldung sondern das programm friert

    weiss jemand wieso ??

    wenn ich for 0 to 15 benute und ich in der schleife i = i-1 reintuh muss eigentlich die schleife statt 16 mal 17 mal laufen oder???


    danke

    ps: das proble liegt bei i = i - 1 wenn ich die zeile weglasse krieg ich die zahlen auf der listbox und ich kriege auch keine dopell zahlen jedoch krieg ich nur 10 oder 11 statt 16 weil er einfach die 2 mal vorkommenden zahlen nicht addiert aber die schleife leuft weiter und so krieg ich keine 16 zahlen !!

    danke
    Schäm dich nicht "Zu fragen", schäm dich "Nicht zu wissen". ?(
    was meinst du michael?

    i gehoert zur ersten schleife und das prinzip ist einfach

    ich laufe eine zweite schleife dort wird abgefragt ob zahl in listbox vorkommt wenn ja dann found = true und raus aus der schleife wenn nicht vorkommt wird zahl in die listbox hingefuegt

    und wenn found true ist wird nix hinzugefuegt aber wenn die erste schleife weiter geht verliere ich eine zahl was ich versucht habe ist dass er die schleife wieder versucht

    also wenn die schleife von 0 to 15 auf 3 war und die zahl vorgekommen ist dann will ich das 3 wieder leuft und nicht 4 !!

    ich sehe nicht was es mir bringen wird wenn ich die if found = true auch in die schleife rein tuh da bringt nix

    danke
    Schäm dich nicht "Zu fragen", schäm dich "Nicht zu wissen". ?(
    hab ich reingetan michael hat nicht geholfen

    programm friert wie vorher keine fehlermeldung aber program bleibt stecken


    ps

    ich sags nochmal wenn ich i = i - 1 weglasse funktioniert der code jedoch krieg ich keine 16 zahlen sondern weniger weil was versteandlich ist denn wenn die zahl vorkommt passiert nichts und die schleife leuaft weiter so hab ich eine zahl verloren wenn dass mehrmals passiert verliere ich mehrere zahlen

    wie kann ich die schleife in der gleichen position wieder laufen ohne das sie eine stufe weiter geht
    zb:

    for i as integer = 0 to 15 bedeutet

    schleife nummer 0 leuft - zahl kommt nicht vor listbox wird die random zahl addiert
    schleife nummer 1 leuft - zahl kommt nicht vor listbox wird die random zahl addiert
    schleife nummer 2 leuft - zahl kommt nicht vor listbox wird die random zahl addiert
    schleife nummer 3 leuft - zahl kommt vor es wird keine zahl addiert und jetzt will ich nicht das schleife nummr 4 leuft sondenr wieder 3
    ...

    deshalb hab ich geschrieben i = i -1 denn i ist in diesem fall 3 und i = i -1 daraus wird 2 und dann wird auf die 2 bei dern neachsten schelfie eine 3 statt 4

    ist komplieziert zu erklearen
    Schäm dich nicht "Zu fragen", schäm dich "Nicht zu wissen". ?(

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „miko1204“ ()

    :thumbsup: wow !!

    danke memo spitzen loesung viel kuerzer und einfacher

    danke dir !!!! :thumbsup:

    ps:

    koenntest du mir vielleicht einbisschen deinen code erklearen?

    was wird genau abgefragt bei

    If ListBox1.Items.IndexOf(z) = -1 Then

    danke
    Schäm dich nicht "Zu fragen", schäm dich "Nicht zu wissen". ?(

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „miko1204“ ()

    Lass die Schleife solange laufen wie count nicht 15 ist, dann kann dir egal sein, wie oft die selbe Zahl generiert wird.

    do while list.items.count <> 15

    VB.NET-Quellcode

    1. Do While ListBox1.Items.Count <> 15
    2. found = False
    3. zahl = ran.Next(0, 15)
    4. If ListBox1.Items.Count = 0 Then
    5. ListBox1.Items.Add(zahl)
    6. Else
    7. For i2 As Integer = 0 To ListBox1.Items.Count - 1
    8. If ListBox1.Items(i2) = zahl Then
    9. found = True
    10. Exit For
    11. End If
    12. Next
    13. If found = False Then
    14. ListBox1.Items.Add(zahl)
    15. Else
    16. End If
    17. End If
    18. Counter += 1
    19. Loop
    20. MsgBox(Counter)


    edit: Er hat es perfektioniert.. :D
    Oder:

    VB.NET-Quellcode

    1. Dim l As New List(Of Integer)
    2. For a = 1 To 15
    3. l.Add(a)
    4. Next
    5. Dim r As New Random
    6. l = (From c In l Order By r.Next(1, 16) Take 15).ToList
    7. For a = 0 To 14
    8. ListBox1.Items.Add(l.Item(a).ToString)
    9. Next


    Die bei mehreren Zahlen DEUTLICH schnellere Linq Variante

    //Edit:
    Hab grad mal aus Interesse beide Verfahren zeitlich verglichen:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Dim Zahlen As Integer = 500
    2. Dim ws As New Stopwatch
    3. ws.Start()
    4. Dim l As New List(Of Integer)
    5. For a = 1 To Zahlen
    6. l.Add(a)
    7. Next
    8. Dim r As New Random
    9. l = (From c In l Order By r.Next(1, Zahlen + 1) Take Zahlen).ToList
    10. For a = 0 To Zahlen - 1
    11. ListBox1.Items.Add(l.Item(a).ToString)
    12. Next
    13. ws.Stop()
    14. Debug.Print("LINQ: " & ws.ElapsedMilliseconds.ToString)
    15. ListBox1.Items.Clear()
    16. ws.Reset()
    17. ws.Start()
    18. Do
    19. Dim z As Integer = New Random().Next(Zahlen + 1)
    20. If ListBox1.Items.IndexOf(z) = -1 Then
    21. ListBox1.Items.Add(z)
    22. End If
    23. Loop Until ListBox1.Items.Count = Zahlen
    24. ws.Stop()
    25. Debug.Print("PROBIEREN: " & ws.ElapsedMilliseconds.ToString)



    Ausgabe:

    LINQ: 69
    PROBIEREN: 15435


    Gruß mono
    Das ist meine Signatur und sie wird wunderbar sein!

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Mono“ ()