Zufallsproblem

  • VB.NET

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Zufallsproblem

    Hallo Community,

    habe folgendes Problem.

    Wie gut die Ernte im letztes Jahr war soll per Zufall ausgewählt werden. Es gibt 5 mögliche Ernten.
    1. miserable Ernte
    2. schlechte Ernte
    3. normale Ernte
    4. gute Ernte
    5. reiche Ernte

    Wobei normale Ernte oft vorkommt, schlechte und gute Ernte häufig vorkommen und miserable und reiche Ernte selten vorkommt.
    Zurzeit habe ich das wie folgt gelöst:

    VB.NET-Quellcode

    1. Dim ernte As New Random
    2. For i As Integer = 1 To 99
    3. Label42.Text = ernte.Next(1, 28)
    4. If Label42.Text = 1 Then
    5. Label4.Text = "miserable Ernte"


    normale Ernte kommt 10 mal vor
    gute und schlechte Ernte 6 mal
    und miserable und reiche 2 mal.

    Das kann man warscheinlich auch besser lösen. Habt ihr da eine Idee für mich?
    Wäre euch sehr dankbar. Vielen Dank schonmal im Vorraus.
    Sieh Dir mal dies an:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Enum Ernten
    2. miserable_Ernte
    3. schlechte_Ernte
    4. normale_Ernte
    5. gute_Ernte
    6. reiche_Ernte
    7. End Enum
    8. Private alleErnten() As Ernten = {Ernten.miserable_Ernte, Ernten.miserable_Ernte, Ernten.reiche_Ernte, Ernten.reiche_Ernte, Ernten.gute_Ernte, Ernten.gute_Ernte, Ernten.gute_Ernte, Ernten.gute_Ernte, Ernten.gute_Ernte, Ernten.gute_Ernte, Ernten.schlechte_Ernte, Ernten.schlechte_Ernte, Ernten.schlechte_Ernte, Ernten.schlechte_Ernte, Ernten.schlechte_Ernte, Ernten.schlechte_Ernte, Ernten.normale_Ernte, Ernten.normale_Ernte, Ernten.normale_Ernte, Ernten.normale_Ernte, Ernten.normale_Ernte, Ernten.normale_Ernte, Ernten.normale_Ernte, Ernten.normale_Ernte, Ernten.normale_Ernte, Ernten.normale_Ernte}
    9. Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
    10. Dim ernte As New Random
    11. For i As Integer = 0 To 99
    12. Debug.Print(alleErnten(ernte.Next(0, alleErnten.Length - 1)).ToString)
    13. Next
    14. Stop
    15. End Sub
    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!
    zb

    VB.NET-Quellcode

    1. Private Sub foo()
    2. Dim r As New Random
    3. Dim Verteilung() = {1, 7, 17, 23, 24}
    4. Dim Texte() = {"bescheiden", "suboptimal", "ok", "schon besser", "der Hammer"}
    5. Dim Resultat(Verteilung.Count - 1) As Integer
    6. For k = 1 To 1000000
    7. Dim zufall = r.Next(1, Verteilung.Max + 1)
    8. Dim idx As Integer
    9. For idx = 0 To Verteilung.Count - 1
    10. If Verteilung(idx) >= zufall Then Exit For
    11. Next
    12. Resultat(idx) += 1
    13. Next
    14. For i = 0 To Resultat.Count - 1
    15. Debug.Print("Die Ernte war {0} mal {1}", Resultat(i), Texte(i))
    16. Next
    17. End Sub


    EDIT Sorry, falsche Nummern -> Dim Verteilung() = {1, 4, 14, 17, 18}

    EDIT2:
    Wenn man's etwas umbaut, kann man die Verteilung besser sehen:

    VB.NET-Quellcode

    1. Dim Verteilung() = {1, 3, 10, 3, 1}
    2. For i = 1 To Verteilung.Count - 1
    3. Verteilung(i) = Verteilung(i) + Verteilung(i - 1)
    4. Next

    So kann man direkt die relative Häufigkeit ins Array schreiben und man fummelt die dann einfach auf ne fortlaufende Summe um, die man dann für die Zufallsfunktion verwenden kann.

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

    RodFromGermany schrieb:

    Sieh Dir mal dies an:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Enum Ernten
    2. miserable_Ernte
    3. schlechte_Ernte
    4. normale_Ernte
    5. gute_Ernte
    6. reiche_Ernte
    7. End Enum
    8. Private alleErnten() As Ernten = {Ernten.miserable_Ernte, Ernten.miserable_Ernte, Ernten.reiche_Ernte, Ernten.reiche_Ernte, Ernten.gute_Ernte, Ernten.gute_Ernte, Ernten.gute_Ernte, Ernten.gute_Ernte, Ernten.gute_Ernte, Ernten.gute_Ernte, Ernten.schlechte_Ernte, Ernten.schlechte_Ernte, Ernten.schlechte_Ernte, Ernten.schlechte_Ernte, Ernten.schlechte_Ernte, Ernten.schlechte_Ernte, Ernten.normale_Ernte, Ernten.normale_Ernte, Ernten.normale_Ernte, Ernten.normale_Ernte, Ernten.normale_Ernte, Ernten.normale_Ernte, Ernten.normale_Ernte, Ernten.normale_Ernte, Ernten.normale_Ernte, Ernten.normale_Ernte}
    9. Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
    10. Dim ernte As New Random
    11. For i As Integer = 0 To 99
    12. Debug.Print(alleErnten(ernte.Next(0, alleErnten.Length - 1)).ToString)
    13. Next
    14. Stop
    15. End Sub


    Das ist perfekt! Genauso was hab ich gesucht/gebraucht! Macht genau das was ich will und ist auch noch leicht einzubauen! Ich wusste doch hier werde ich geholfen :)
    Vielen Vielen Dank!
    Gern geschehen.
    Bitte zitiere nicht die ganzen Beiträge, wenn Du einen bestimmten Autor bemühen willst, geht das einfach so:
    @ Name : (ohne Leerzeichen)
    @MisterRieus:
    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!
    Auf jeden Fall ist Label1 ... Label42 besser als LblBla und so, wewnn Du hier im Forum ein Problem schilderst, was wir dann fix mal nachvollziehen können.
    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!