Zufallszahl in %!

  • VB.NET

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

    Zufallszahl in %!

    Überschrift sagt eigentlich alles!
    Ich möchte zB. zu 1% den text ("WIN") Anzeigen, zu 20% ("2.WIN") Usw.!
    Ich habe in der sufu nix über "%" gefunden^^ nur wie man normale random zahlen generiert :D
    ich bitte um hilfe!
    Wenn ich es richtig verstanden habe, kommt es darauf an wieviele versuche es sind:
    relative häufigkeit = absolute häufigkeit / anzahl der daten (Versuche)
    Moderatorin: "Apropo ritzen.." Shin Chan: "hoho sie hat Po ritze gesagt"
    "saying to buy a mac because your anti-virus expired is like saying you're out of condoms so you're just going to go fuck dudes"
    "Wie auch in anderen Threads kann ich leider nichts bieten außer vielleicht spaß beim Skypen aber mehr leider auch nicht." - Sind kinder pornos nicht verboten?

    VB.NET-Quellcode

    1. Public Class Form1 'Ich hoffe mal ich hab das Problem richtig verstanden...
    2. 'Also insgesamt werden einfach nur zwei Labels und ein Button benötigt
    3. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    4. Dim ZufallsGenerator As New Random 'Eben der Zufallsgenerator
    5. Dim ErsterProzentsatz As Integer = 1 'Die drei Prozentsätze
    6. Dim ZweiterProzentsatz As Integer = 20
    7. Dim DritterProzentsatz As Integer = 40
    8. Dim Zufallszahl As Integer = ZufallsGenerator.Next(0, 100) 'Das generieren der Zufallszahl
    9. Label2.Text = Zufallszahl.ToString 'Nur zur Überprüfung der Zufallszahl
    10. 'Als Beispiel wird jetzt einfach immer ein Zahlenbereich abgefragt:
    11. If Zufallszahl = ErsterProzentsatz Then 'Ich hab es jetzt einfach mal in If Abfragen gepackt...
    12. Label1.Text = "Wow, nur 1% Wahrscheinlichkeit hierfür! Das Video ist eigentlich ganz gut:" _
    13. & vbCrLf & "http://www.youtube.com/watch?feature=player_embedded&v=rp8hvyjZWHs"
    14. End If
    15. If Zufallszahl > ErsterProzentsatz And Zufallszahl < ZweiterProzentsatz + ErsterProzentsatz Then
    16. Label1.Text = "Zwanzig Prozent Wahrscheinlichkeit hierfür"
    17. End If
    18. If Zufallszahl > ZweiterProzentsatz + ErsterProzentsatz And Zufallszahl < DritterProzentsatz + ZweiterProzentsatz + ErsterProzentsatz Then
    19. Label1.Text = "und 40 Prozent Wahrscheinlichkeit hierfür"
    20. End If
    21. 'Ich hab es jetzt noch nicht wirklich getestet aber sollte funktionieren...
    22. 'Solltest du wenig verschiedene Prozente haben, würde sich sogar das hingeschmierte hier eignen
    23. 'Falls du mehr brauchst, würde ich nochmal einen der besseren hier im Forum befragen, wie man vielleicht merkt, hab ich auch gerade erst letztens angefangen...
    24. End Sub
    25. End Class
    Ich würde das so machen, ist warscheinlich aber nicht die beste und effizienste Lösung:

    -Du machst eine Liste mit den möglichen Ausgaben: "Win1", "Win2", "Win3",...
    -Danach machst du Random(0, Anzahl der möglichen Ausgaben), und greifst auf die Liste zu List(randomZahl)
    -Danach noch ein Random mit dem Prozenwert, Random(0, 10) == 5 z.B 10%

    Nur ein Ansatz ^^
    Was hat das Design (Labels, Buttons etc) mit der LOGIK zu tun?

    Klar es ist eigentlich selbstverständlich, welche Steuerelemente ich benutzt habe, wenn man den Quelltext dann testen will, aber ist es so nicht einfacher? Vielleicht habe ich auch deinen Einwand nicht verstanden. Schließlich habe ich nur darauf verwiesen, was noch im Designer gemacht werden musste.

    BTW: Und jetzt noch mal den Code für 60 verschiedene Ereignisse ...

    Da hat Byte schon etwas zu geschrieben. Außerdem habe ich in meinem Beitrag geschrieben, dass ich jetzt eben nur Beispielhaft drei verschiedene Zahlenbereiche abfrage, mehr eben nicht...

    Telcrome schrieb:

    dass ich jetzt eben nur Beispielhaft drei verschiedene Zahlenbereiche abfrage, mehr eben nicht...

    Und weiter oben hatte ich bereits auf eine allgemeingültige Lösung hingewiesen ...

    Man kanns sogar noch weiter trivialisieren:

    VB.NET-Quellcode

    1. Dim verteilung() As Integer = {1, 20, 30, 100} ' relative Häufigkeit, summiert!
    2. Dim r As New Random
    3. Dim wert = r.Next(1, verteilung.Max + 1)
    4. Dim index = (From i In Enumerable.Range(0, verteilung.Count) Select i Where verteilung(i) >= wert Take 1).First
    5. Debug.Print("Zufall {0} => Index {1}", wert, index)
    So richtig hab ichs jetzt nicht verstanden :DD
    Ich bräuchte nen kurzen C&P wo auch schon das mit den labeln und buttons drinn ist =)
    Ich habs jetzt mal so gelöst:

    VB.NET-Quellcode

    1. Dim ZufallsGenerator As New Random
    2. Dim Zufallszahl As Integer = ZufallsGenerator.Next(0, 101)
    3. Label2.Text = Zufallszahl
    4. If Label2.Text = 1 Or Label2.Text = 2 Or Label2.Text = 3 Or Label2.Text = 4 Or Label2.Text = 5 Or Label2.Text = 6 Or Label2.Text = 7 Or Label2.Text = 8 Or Label2.Text = 9 Or Label2.Text = 10 Then
    5. MsgBox("Diese Nachricht kommt zu 10%!")
    6. Else
    7. MsgBox("Diese Nachricht kommt zu 90%!")
    8. End If


    Jedoch habe ich das gefühl, das es nach irgendeinem system generiert... es kommt sehr oft die zahl 1 vor... sehr nahaneinandere zahlen werden nacheinander ausgegeben...
    Ist das normal? ^^
    Der Zufallsgenerator muss ja auch irgendwie gefüttert werden. Machst du das nicht, dann macht es das System für dich. Und dann wird der Startwert mit Hilfe der Zeit erzeugt.
    Deshalb wird der Generator 1x am Start erzeugt.

    VB.NET-Quellcode

    1. Dim zufallszahl As Integer
    2. Dim zufGenerator As New Random
    3. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    4. zufallszahl = zufGenerator.Next(0, 10)
    5. label2.text = zufallszahl.ToString 'Zufallszahl ist INTEGER, Label.text ist STRING !!!
    6. Select Case zufallszahl
    7. Case 1 To 9
    8. MessageBox.Show("1 to 9")
    9. Case Else
    10. MessageBox.Show("sonst")
    11. End Select
    12. End Sub


    PS: hast du nicht deine 10% und 90%-Aussage vertauscht?
    PPS: warum weist du eine Integer-Variable einem Label zu und fragst anschließen das LABEL ab? (Warum fragst du nicht die Zufallszahl ab? Ist nicht egal)
    1. Option Strict On
    2. Dim ZufallsGenerator As New Random darfst Du nur ein Mal aufrufen :!: :!: :!:
    2. Du hast einen Integer-Wert und testest auf einen String. Bei Integer kanst Du Bereiche testen:

    VB.NET-Quellcode

    1. If Zufallszahl >= 0 AndAlso Zufallszahl <= 10 Then
    2. ' bla
    3. End If
    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!
    Neues Problem :D
    Ich brauche diesen generator 2x, jedoch hat der zweite immer die zahl vom ersten! hier der code!

    VB.NET-Quellcode

    1. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    2. Dim ZufallsGenerator As New Random
    3. Dim Zufallszahl As Integer = ZufallsGenerator.Next(1, 101)
    4. Label3.Text = Zufallszahl
    5. If Zufallszahl = 1 Or Zufallszahl = 2 Or Zufallszahl = 3 Or Zufallszahl = 4 Or Zufallszahl = 5 Or Zufallszahl = 6 Or Zufallszahl = 7 Or Zufallszahl = 8 Or Zufallszahl = 9 Or Zufallszahl = 10 Then
    6. Label1.Text = "Forcepack!"
    7. Else
    8. Label1.Text = "Guthaben + 0"
    9. End If
    10. Dim ZufallsGenerator2 As New Random
    11. Dim Zufallszahl2 As Integer = ZufallsGenerator2.Next(1, 101)
    12. Label4.Text = Zufallszahl2
    13. If Zufallszahl2 = 1 Or Zufallszahl2 = 2 Or Zufallszahl2 = 3 Or Zufallszahl2 = 4 Or Zufallszahl2 = 5 Or Zufallszahl2 = 6 Or Zufallszahl2 = 7 Or Zufallszahl2 = 8 Or Zufallszahl2 = 9 Or Zufallszahl2 = 10 Then
    14. Label2.Text = "Forcepack!"
    15. Else
    16. Label2.Text = "Guthaben + 0"
    17. End If
    18. End Sub

    VB.NET-Quellcode

    1. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    2. Dim ZufallsGenerator As New Random
    3. ' ...
    4. End Sub
    Hatten wir doch schon. ==>

    VB.NET-Quellcode

    1. Private ZufallsGenerator As New Random
    2. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    3. ' ...
    4. 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!
    Trotzdem werden die gleichen zahlen generiert...

    VB.NET-Quellcode

    1. Private ZufallsGenerator As New Random
    2. Private ZufallsGenerator2 As New Random
    3. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    4. Dim Zufallszahl As Integer = ZufallsGenerator.Next(1, 101)
    5. Label3.Text = Zufallszahl
    6. If Zufallszahl = 1 Or Zufallszahl = 2 Or Zufallszahl = 3 Or Zufallszahl = 4 Or Zufallszahl = 5 Or Zufallszahl = 6 Or Zufallszahl = 7 Or Zufallszahl = 8 Or Zufallszahl = 9 Or Zufallszahl = 10 Then
    7. Label1.Text = "Forcepack!"
    8. Else
    9. Label1.Text = "Guthaben + 0"
    10. End If
    11. Dim Zufallszahl2 As Integer = ZufallsGenerator2.Next(1, 101)
    12. Label4.Text = Zufallszahl2
    13. If Zufallszahl2 = 1 Or Zufallszahl2 = 2 Or Zufallszahl2 = 3 Or Zufallszahl2 = 4 Or Zufallszahl2 = 5 Or Zufallszahl2 = 6 Or Zufallszahl2 = 7 Or Zufallszahl2 = 8 Or Zufallszahl2 = 9 Or Zufallszahl2 = 10 Then
    14. Label2.Text = "Forcepack!"
    15. Else
    16. Label2.Text = "Guthaben + 0"
    17. End If
    18. End Sub

    Edit: Gelöst ;D habe den Generator nur 1x jetzt aufgerufen :D