Random

  • VB.NET

Es gibt 14 Antworten in diesem Thema. Der letzte Beitrag () ist von LaMa5.

    Ich hab eine PictureBox in der werden durcheinander Bilder angezeigt aus der ImageList. Ich hab in der ImageList momentan 15 Bilder. Das funktioniert bisher auch super. Nur werden mir nicht die 15 Bilder angezeigt sondern nur 6 Bilder und zwar in der Reihenfolge

    1
    10
    4
    3
    12
    6
    1

    Wie kann ich das nun so einstellen das mir alle angezeigt werden.

    VB.NET-Quellcode

    1. Sub rnd1()
    2. Dim r As New System.Random()
    3. Dim a As Byte
    4. For a = 1 To ImageList1.Images.Count() ' ImageList1.Images.Count() liefert 15
    5. item = (r.Next(1, ImageList1.Images.Count))
    6. Next
    7. End Sub

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    3. rnd1()
    4. End Sub
    5. Sub rnd1()
    6. Dim r As New System.Random()
    7. Dim a As Byte
    8. For a = 1 To 15 ' ImageList1.Images.Count() liefert 15
    9. Dim item As Integer = r.Next(1, 15)
    10. MsgBox(item)
    11. Next
    12. End Sub
    13. End Class


    also ich kann dein Problem nicht nachstellen.

    item bekomm von 1-15 jeden wert zugewiesen

    was allerdings passieren kann ist das in einem Durchgang ( bei dir hier 15 durchgänge ) die Warscheinlichkeit groß ist das ein Bild doppelt angezeigt wird und da du ja auf 15 begrenzt hast eben manche Bilder pro Durchgang nicht angezeigt werden
    Hallo,



    du begrenzt die Anzahl der Schleifendurchläufe auf die Anzahl der Bilder in deiner Liste.

    Die Zufallsfunktion liefert aber nicht jedesmal einen Wert, der sich von allen Vorhergehenden unterscheidet. Somit werden Bilder doppelt gezeigt, was du aber nicht erkennen kannst. Mach doch einfach mal eine msgbox in die Schleife, die dir den Bildnamen ausgibt.

    Des weiteren übersiehst du, dass die Zufallsfunktion nicht zufällig ist, sondern auf Grund einer mathematischen Funktion scheinbar zufällige Werte ermittelt. Deswegen erhältst du immer die selbe Reihenfolge.

    Um die Funktion wirklich zufällig zu machen, musst du sie einmal mit

    randomize()

    initialisieren.

    Um alle Bilder anzuzeigen, solltest du ein Array einführen, in dem die Nummern der bisher gezeigten Bilder gespeichert werden. Dann vergleichst du, ob die Zufallszahl für das nächste Bild schon in dem Array enthalten ist: wenn ja, muss nochmals eine Zufallszahl bestimmt werden.

    mfg



    Me_Hide

    Ein Randomize ist in vb.net nicht mehr nötig. Allerdings initialisierst du deine Random-Variable jedes Mal neu und das sollte man nicht tun. Ohne Angabe eines Startparameters wird beim Initialisieren der Tick-Count des Systems verwendet. bei Schleifendurchläufen kann es daher in der Tat passieren daß du genau die gleiche Reihenfolge bekommst, weil sich zwischen den beiden Durchläufen der Startwert nicht verändert hat. Daher besser: Die Random Deklaration und Initialisierung als Klassenvariable vornehmen!

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    3. rnd1()
    4. End Sub
    5. Sub rnd1()
    6. Dim r As New System.Random()
    7. Dim a As Byte
    8. Dim s as String = ""
    9. Dim item As Integer
    10. Do While a < 15 'Schleife solange a kleiner 15 ist
    11. item = r.Next(1, 15) ' holt eine Zufallszahl
    12. If Not s.Contains(item & ",") Then ' überprüft ob die Zahl schon mal gewählt wurde
    13. s &= item & "," ' wenn nicht wird sie dem String hinzugefügt
    14. a += 1 ' zähler um 1 erhöht
    15. End If
    16. Loop
    17. End Sub
    18. End Class


    Der Code ist jetzt ungetestet, aber so in etwa müsste es gehen, vielleicht noch ein DoEvent() einbauen, damit dein Programm nicht hängt. Statt einem String kann man natürlich auch ein Array nehmen, wo man die schon gewählten Werte einträgt, nur weiß ich nicht wie man dort in VB.Net auf existens eines Elements prüft! Deswegen in meinem Beispiel mit String.Contains()
    So hab jetzt probiert und es funktioniert immer noch nicht. Gibt es eine einfachere Lösung.

    VB.NET-Quellcode

    1. Sub rnd1()
    2. Dim r As New System.Random()
    3. Dim a As Byte
    4. Dim s As String = ""
    5. Dim item As Integer
    6. Do While a < 15 'Schleife solange a kleiner 15 ist
    7. item = r.Next(1, 15) ' holt eine Zufallszahl
    8. If Not s.Contains(item & ",") Then ' überprüft ob die Zahl schon mal gewählt wurde
    9. s &= item & "," ' wenn nicht wird sie dem String hinzugefügt
    10. a += 1 ' zähler um 1 erhöht
    11. End If
    12. Application.DoEvents()
    13. Loop
    14. End Sub
    hier is mall mein beitrag zu einer random Funktion es kann alles beliebe nach denn Cases Sein

    ich haffe es hilft einige
    Key = (Rnd() * Anzahl Der Cases Angeben zb 5)



    VB.NET-Quellcode

    1. Dim Key As Integer
    2. Key = (Rnd() * 5)
    3. Select Case Key
    4. Case 1
    5. Me.BackColor = Color.Red
    6. Case 2
    7. Me.BackColor = Color.Green
    8. Case 3
    9. Me.BackColor = Color.GreenYellow
    10. Case 4
    11. Me.BackColor = Color.Pink
    12. Case 5
    13. Me.BackColor = Color.LightBlue
    14. End Select
    Hi,

    @Hobby >vb
    Die Meldung VOR absenden Deines Beitrags hast Du ja gekonnt ignoriert. Dieser Thread ist mittlerweile 4 (in Worten VIER) Jahre alt. Glubst Du ernsthaft e interessiert den TE jetzt noch?

    -> *closed*


    bye ...

    LaMa5.
    Die Wissenschaft wird nie ein besseres Kommunikationssystem in den Büros erfinden können als die Kaffeepause.
    (Autor: Earl Wilson, amerik. Schriftsteller)

    https://www.serviceteam-md.de