Random next Variation

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 13 Antworten in diesem Thema. Der letzte Beitrag () ist von VaporiZed.

    Random next Variation

    Hallo
    und zwar verwende ich bis jetzt immer eine Random-Variable und die numerierung ist ganz normal von 0 - 40:

    VB.NET-Quellcode

    1. dim myrandom as new random
    2. myrandom.next(0,40)



    Jetzt moechte ich aber nicht die Zahlen von 0-40 durchgehen durchgehen, sondern abschnitte davon: also von 7-18 und von 23-32. Alle anderen Zahlen sollen nicht beruecksichtig werden.
    (Es handelt sich dabei um listbox.selectedindex). Kann man das umsetzen? danke lg
    Nun, wenn das Ergebnis einen bestimmten ListBox-Index nur abdecken soll, dann speicher doch die generierte Zufallszahl in einer Variable und schau, ob sie zu Deinem Bereich passt. Wenn nicht, generiere solange eine neue, bis es passt:

    VB.NET-Quellcode

    1. Dim myrandom As New Random, NextListBoxIndex = 0
    2. Do
    3. NextListBoxIndex = myrandom.Next(0, 40)
    4. Loop Until NextListBoxIndex >= 7 AndAlso NextListBoxIndex <= 18 OrElse NextListBoxIndex >= 23 AndAlso NextListBoxIndex <= 32


    Oder die Abbruch-Bedingung in eine Function auslagern, um es flexibler zu gestalten.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Das mit dem "so lange neu generieren, bis es passt" ist ungünstig, wenn die Wahrscheinlichkeit, dass es passt, gering ist, weil man dann viele Zufallszahlen generieren muss.
    Es gibt hier ganz unterschiedliche Herangehensweisen. Welche Du verwenden solltest, hängt stark von Deiner Situation ab.

    Du solltest ein paar Ungereimtheiten aufklären:
    Du schreibst zwar "Zahlen von 0 bis 40", aber Du verwendest Rnd.Next(0, 40). Bist Du Dir bewusst, dass hier nur Zufallszahlen von 0 bis 39 rauskommen? Das Minimum ist immer inklusive und das Maximum ist exklusive.
    Bitte erkläre also genau, was Du jetzt meinst. Meinst Du inklusive 0 bis inklusive 40 (Rnd.Next(0, 41)) oder inklusive 0 bis inklusive 39 (Rnd.Next(0, 40))? Das gleiche gilt für die anderen Bereiche, die Du erwähnt hast.
    Das andere ist "listbox.selectedindex". Das ist nur eine einzige Zahl. Aus Deiner Erklärung ist nicht ersichtlich, wie diese eine Zahl jetzt mit den Zufallszahlen zusammenhängt. Meintest Du vielleicht SelectedIndices (also die Mehrzahl)?
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils
    @Niko Ortner Jou.
    @VaporiZed Nou.

    Visual_Prog schrieb:

    von 7-18
    Warum sieht sich keiner die Überladungen von Random.Next() an?

    VB.NET-Quellcode

    1. Dim MeineZahl = myrandom.Next(7, 18)
    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!
    @RodFromGermany: Weil der TE meinte, dass er eine Zufallszahl haben will, die zwischen 7 und 18 oder 23 und 32 liegt. Dein Vorschlag erzeugt nur eine Zahl zwischen 7 und 17, wobei der andere Bereich gar nicht abgedeckt wird.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    @VaporiZed Das hat @Niko Ortner erläutert. Deine Pseudo-Zufallszahlen sind mit der von Dir gemachten Einschränkung eben nicht mehr "richtig" "zufällig".
    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!
    danke fuer die Vorschlaege und fuer die Aufklaerung.

    gemeint ist inklusive 40, also Rnd.Next(0, 41)).

    fuer die nderen bereiche ist es ebenso inklusive der letzten zahl, also muss ich ein zahl mehr schreiben.
    7-19 und 23-33.

    im bezug auf das listbox.selecteditem ist das bei mir so, dass die zahl generiert wird und diese zahl bestimmt dann den listbox.selectedindex, deswegen reicht eine zhl hier aus.

    ich hab das jetzt so geloest, es gibt ja 2 bereiche wo sich die der selectedindex bewegen kann also 7-19 und 23-33.
    meine loesung ist einfach davor eine randomfunktion zu schlaten die mit einem integer gekoppelt ist von der das abhaengig ist in welchen bereich man reinkomt und damit hat sich das :)

    danke sehr : )

    VB.NET-Quellcode

    1. Dim rdn as New Random
    2. Dim rdn2 As New Random
    3. Dim zahl As Integer
    4. zahl = rdn2.Next(0, 2)
    5. If zahl = 0 Then
    6. LB_Themen.SelectedIndex = rdn.Next(7,19)
    7. ElseIf zahl = 1 Then
    8. LB_Themen.SelectedIndex = rdn.Next(23,33)
    9. End If

    VB.NET-Quellcode

    1. Dim rnd As New Random 'Irgendwo an den Anfang und nur ein Mal pro Projekt starten
    2. LB_Themen.SelectedIndex = If(rnd.Next(0, 2) = 0, rnd.Next(7, 19), rnd.Next(23, 33))


    Freundliche Grüsse

    exc-jdbi

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „exc-jdbi“ ()

    @Visual_Prog
    Gut, dass Du das alles erklärt hast.
    Zu Deiner Lösung möchte ich hinzufügen:
    Es reicht aus, nur ein Random-Objekt zu erstellen und das mehrmals zu verwenden, so wie exc-jdbi das gezeigt hat. Es ist auch wichtig, dass Du nicht jedes Mal ein neues Objekt erstellst, wenn die Methode, in der der Code steht, ausgeführt wird, sondern dass Du nur einmal ein Objekt ganz am Anfang erstellst und dieses immer verwendest.

    VB.NET-Quellcode

    1. 'Also nicht so:
    2. Sub Foo()
    3. Dim Rnd As New Random
    4. Bar = Rnd.Next(Baz)
    5. End Sub
    6. 'Sondern so:
    7. Dim Rnd As New Random
    8. Sub Foo()
    9. Bar = Rnd.Next(Baz)
    10. End Sub


    Das andere ist, dass die Zufallszahlen, die Du jetzt generierst, nicht gleichmäßig verteilt sind, weil die beiden Bereiche unterschiedlich groß sind:
    (100000000 Zahlen insgesamt)
    Die Zahlen im kleineren Bereich kommen insgesamt öfter vor.
    Ich denke, dass das in Deinem Fall nicht so schlimm ist, denn der Unterschied ist nicht allzugroß und es wird nur ein Eintrag in einer ListBox ausgewählt. Es dürfte dem User kaum auffallen. Wenn es mathematisch korrekt sein soll, dann musst Du eine geringfügig andere Lösung verwenden.
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils
    Ich verstehe nicht warum er manche werte nicht durchlaeuft:
    tb_random1 : 2
    tb_random2: 4
    tb_random3: 6
    tb_random4: 8

    VB.NET-Quellcode

    1. ElseIf TB_random1.Text <> "" And TB_random3.Text <> "" And TB_random5.Text = "" Then
    2. Dim rdn as New Random
    3. Dim rdn2 As New Random
    4. Dim zahl As Integer
    5. zahl = rdn2.Next(0, 2)
    6. If zahl = 0 Then
    7. LB_Themen.SelectedIndex = rdn.Next(CInt(TB_random1.Text), CInt(TB_random2.Text) + 1)
    8. ElseIf zahl = 1 Then
    9. LB_Themen.SelectedIndex = rdn.Next(CInt(TB_random3.Text), CInt(TB_random4.Text) + 1)
    10. End If
    11. End If


    -> er gibt nur 2,3,7 und 8 raus. Wo bleibt die 4 und wo bleibt die 6 ? : /
    Hallo @Visual_Prog

    Ich habe es jetzt kurz auf der Konsole gemacht, und habe mir dazu deine TextBoxes einfach als Integer deklariert.
    Das Resultat so finde ich, sieht gar nicht schlecht aus. Die Grenzen (min/max) sind bei dir halt sehr eng gehalten.


    VB.NET-Quellcode

    1. Option Strict On
    2. Option Explicit On
    3. Public Module Module1
    4. Dim rnd As New Random 'Nur einmal
    5. Dim cnt As Integer = 50
    6. Dim tb_random1 As Integer = 2, tb_random2 As Integer = 4
    7. Dim tb_random3 As Integer = 6, tb_random4 As Integer = 8
    8. Dim LB_Themen_SelectedIndex As New List(Of Integer)(cnt)
    9. Public Sub Main()
    10. For i As Integer = 0 To cnt - 1
    11. LB_Themen_SelectedIndex.Add(If(rnd.Next(0, 2) = 0, rnd.Next(tb_random1, tb_random2 + 1), rnd.Next(tb_random3, tb_random4 + 1)))
    12. Console.Write(LB_Themen_SelectedIndex(i).ToString & " ")
    13. Next
    14. Console.WriteLine(vbCrLf)
    15. Console.WriteLine("Sortiert")
    16. LB_Themen_SelectedIndex.Sort()
    17. For i As Integer = 0 To cnt - 1
    18. Console.Write(LB_Themen_SelectedIndex(i).ToString & " ")
    19. Next
    20. Console.ReadKey()
    21. End Sub
    22. End Module



    Freundliche Grüsse

    exc-jdbi
    Bilder
    • pic1.jpg

      17,35 kB, 677×340, 125 mal angesehen

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „exc-jdbi“ ()

    @Visual_Prog Bei mir kommen auch alle Zahlen.
    Mach mal aus Deinen TextBoxen NumericUpDowns.
    Und ein Zufallsgenerator genügt, zwei brauchst Du da nicht.
    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!
    @Visual_Prog: Ich hab mal Deinen Code hergenommen und geschaut. Den Fehler konnte ich finden: Es liegt nur an Deinem 2. Zufallsgenerator. Wenn Du rdn2 rausnimmst und zahl durch rdn generieren lässt, läuft es. Nur erklären kann ich es nicht.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.