Zufalls [Random] Texte via Button

  • VB.NET

Es gibt 18 Antworten in diesem Thema. Der letzte Beitrag () ist von petaod.

    Zufalls [Random] Texte via Button

    Hallo liebe Community,
    ich wollte gerade versuchen ein Programm zu schreiben, welches bei drücken des Buttons einen Text erscheinen lässt. Allerdings nicht nur irgendeinen Text, sondern einen Text von vielen, welche ich bereits vorgefertigt habe.

    Allerdings habe ich bei dieser Umsetzung Probleme. Den Code kenne ich derzeit nur noch Zufalls Zahlen, wie es aber mit verschiedenen Sätzen ist weiß ich leider nicht.
    Hier einmal das für zufällige Zahlen:

    Quellcode

    1. TextBox1.Text = Int((100) * Rnd() + 1)



    Ich hoffe hier kann mir jemand helfen.
    Grüße
    Vielen Dank für deine Antwort, schonmal gut zu wissen, dass Rnd() nicht so praktisch ist.
    Leider hilft mir der Link noch nicht wirklich weiter. Aber in der Zeit des wartens war ich natürlich nicht untätig, und habe ein wenig weiter recherchiert, und folgendes gefunden:

    Quellcode

    1. Private Satz(24) As String Sub SätzeEinlesen() Satz(0) = "xxxxxx" Satz(1) = "yyyyyy" ' usw. End Sub



    Quellcode

    1. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim x As Integer x = CInt(24 * Rnd()) TextBox1.Text = Satz(x) End Sub



    Dort ist zwar auch das "böse" Rnd() drin, aber es ist schonmal ein Grundgerüst, welches nur einen Fehler besitzt:
    "end of" Anweisung fehlt. Und an diesem Punkt komme ich leider nicht weiter.

    Grüße
    Hallo, willkommen im Forum!

    1.) Bitte VB Tags benutzen - was ist damit gemeint?

    2.) Außerdem solltest du kein Array nehmen, sondern lieber eine List(Of String). Dann kannst du einfach einen (pseudo-)zufällig ermittelten Index aufrufen und erhälst einen String.
    Vergiss das mit den Texten, die werden über einen Index adressiert.
    Formuliere das eigentliche Problem: Wie generiere ich einen zufälligen Index von 0 bis Anzahl-1, um auf das TextArray zugreifen zu können?

    picoflop schrieb:

    Random.Next(a,b) liefert eine Zahl zwischen a (einschließlich) und b (ausschließlich)
    Probier mal dies:

    VB.NET-Quellcode

    1. Private rnd As Random = New Random
    2. Private MeineTexte() As String = {"lkjh", "oüipüoi", "kjh", "hgf"}
    3. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    4. Label1.Text = MeineTexte(rnd.Next(0, MeineTexte.Length))
    5. 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!
    @patty

    Eröffne bitte das nächste Mal ein neuer Thread. Der hier ist schon bald 6 Jahre alt.

    2 von den texten in einer textbox


    Es kommt drauf an, wie man deine Frage verstehen soll. Wie sollen denn die Texte in die Textbox.

    VB.NET-Quellcode

    1. Private rand As New Random

    VB.NET-Quellcode

    1. Dim woerterliste = New String() {"do", "re", "mi", "fa", "so", "la", "ti", "do"}
    2. 'Möglichkeit 1: Getrennt mit einem Semikolon
    3. DeineTextbox1.Text = String.Format("{0};{1}", woerterliste(rand.Next(woerterliste.Length)), _
    4. woerterliste(rand.Next(woerterliste.Length)))
    5. 'Möglichkeit 2: In mehreren Zeilen (Mehrzeilige Textbox)
    6. DeineTextbox2.Text = String.Format("{1}{0}{2}", vbCrlf, _
    7. woerterliste(rand.Next(woerterliste.Length)), _
    8. woerterliste(rand.Next(woerterliste.Length)))
    9. 'Möglichkeit 3: Mittels Schleife z.B. 2 Stück (Mehrzeilige Textbox)
    10. For i As Int32 = 0 To 1
    11. DeineTextbox3.Text &= String.Format("{1}{0}", vbCrlf, woerterliste(rand.Next(woerterliste.Length)))
    12. Next

    [Private Sub Button7_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnGetRandomItem.Click
    Dim mylist = New String() {TextBox3.Text, TextBox4.Text, TextBox5.Text, TextBox6.Text, _
    TextBox7.Text, TextBox8.Text, TextBox9.Text, TextBox10.Text, _
    TextBox11.Text, TextBox12.Text, TextBox13.Text, TextBox14.Text, _
    TextBox15.Text, TextBox16.Text, TextBox17.Text, TextBox18.Text, _
    TextBox19.Text, TextBox20.Text, TextBox21.Text, TextBox22.Text, _
    TextBox23.Text, TextBox24.Text, TextBox25.Text, TextBox26.Text, _
    TextBox27.Text, TextBox28.Text, TextBox29.Text, TextBox30.Text, TextBox31.Text, TextBox32.Text}

    TextBox2.Text = String.Format("{0};{9}", mylist(rand.Next(mylist.Length)), _
    mylist(rand.Next(mylist.Length)))
    End Sub][/vbnet]
    Versuche hier 10 zuffällige Texte aus meiner liste mit 30 texten zu erzeugen bekomme es nicht hin
    wo ist der Fehler
    8|
    Wenn man von dem Konstrukt absieht: Was hat die {9} in der String.Format-Zeile zu suchen? Da gehört ne 1 rein, da es keinen 10. Parameter in der String-Format-Zeile gibt. Bei {0} wird der erste Parameter eingesetzt, bei {1} der zweite. Und Du hast ja in der Zeile

    VB.NET-Quellcode

    1. TextBox2.Text = String.Format("{0};{9}", mylist(rand.Next(mylist.Length)), _
    2. mylist(rand.Next(mylist.Length)))
    nur 2 Parameter.
    Daher würde es richtig lauten:

    VB.NET-Quellcode

    1. TextBox2.Text = String.Format("{0};{1}", mylist(rand.Next(mylist.Length)), _
    2. mylist(rand.Next(mylist.Length)))
    Oder mit nem akutellen VB mittels interpolierter Strings (man beachte dafür das Dollarzeichen am Anfang des Strings):

    VB.NET-Quellcode

    1. TextBox2.Text = $"{mylist(rand.Next(mylist.Length))};{mylist(rand.Next(mylist.Length))}"

    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.

    patty schrieb:

    wo ist der Fehler

    Du hast nicht verstanden, wie String.Format funktioniert. (Edit: da war VaporiZed schon schneller)

    Das einfachste in deinem Fall ist jedoch, wenn du die Möglichkeit 3 aus Post #9 verwendest und die Schleife bis 9 laufen lässt.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

    VB.NET-Quellcode

    1. Private Sub Button7_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button7.Click
    2. Dim mylist = New String() {TextBox3.Text, TextBox4.Text, TextBox5.Text, TextBox6.Text, _
    3. TextBox7.Text, TextBox8.Text, TextBox9.Text, TextBox10.Text, _
    4. TextBox11.Text, TextBox12.Text, TextBox13.Text, TextBox14.Text, _
    5. TextBox15.Text, TextBox16.Text, TextBox17.Text, TextBox18.Text, _
    6. TextBox19.Text, TextBox20.Text, TextBox21.Text, TextBox22.Text, _
    7. TextBox23.Text, TextBox24.Text, TextBox25.Text, TextBox26.Text, _
    8. TextBox27.Text, TextBox28.Text, TextBox29.Text, TextBox30.Text, _
    9. TextBox31.Text, TextBox32.Text}
    10. Dim cnt As Int32 = 10
    11. 'Das kann auch per Designer gemacht werden
    12. 'Textbox2 unbedingt noch in der Grösse anpassen!!!
    13. TextBox2.Multiline = True
    14. For i As Int32 = 0 To cnt - 1
    15. TextBox2.Text &= String.Format("{1}{0}", vbCrLf, mylist(rand.Next(mylist.Length)))
    16. Next
    17. End Sub


    Das würde auch gehen, und hat den Vorteil, dass zurückgeschrieben werden kann, da alle Textboxen
    in einer ListOfT sind, und somit referenziert sind.

    VB.NET-Quellcode

    1. Dim rand As New Random
    2. Dim mylist As List(Of TextBox)
    3. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    4. mylist = New List(Of TextBox) From {TextBox3, TextBox4, TextBox5, TextBox6, _
    5. TextBox7, TextBox8, TextBox9, TextBox10, _
    6. TextBox11, TextBox12, TextBox13, TextBox14, _
    7. TextBox15, TextBox16, TextBox17, TextBox18, _
    8. TextBox19, TextBox20, TextBox21, TextBox22, _
    9. TextBox23, TextBox24, TextBox25, TextBox26, _
    10. TextBox27, TextBox28, TextBox29, TextBox30, _
    11. TextBox31, TextBox32}
    12. End Sub
    13. Private Sub Button7_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button7.Click
    14. Dim cnt As Int32 = 10
    15. 'Das kann auch per Designer gemacht werden
    16. 'Textbox2 unbedingt noch in der Grösse anpassen!!!
    17. TextBox2.Multiline = True
    18. For i As Int32 = 0 To cnt - 1
    19. TextBox2.Text &= String.Format("{1}{0}", vbCrLf, mylist(rand.Next(mylist.Count)).Text)
    20. Next
    21. End Sub


    Das funktioniert so, und der Text wird in die Textbox3 geschrieben

    VB.NET-Quellcode

    1. mylist(0).Text="Neuer Text"



    Freundliche Grüsse

    exc-jdbi

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

    exc-jdbi schrieb:

    Kannst du ein Bild reinstelllen, oder den Code?
    Ich tippe einfach mal, dass es 1:1 Dein Code ist.

    Ein Schuss ins Blaue: Patty sagte nicht, dass er bei den Zufallstextausgaben keine Duplikate haben wollte. Um sowas zu verhindern gilt es als erstes: Schreiben, was die konkreten Anforderungen/Ziele sind.
    Danach könnte man sowas machen:

    VB.NET-Quellcode

    1. Private Sub Button7_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button7.Click
    2. Dim cnt As Int32 = 10
    3. 'Das kann auch per Designer gemacht werden
    4. 'Textbox2 unbedingt noch in der Grösse anpassen!!!
    5. TextBox2.Multiline = True
    6. Dim ListOfAlreadyUsedTextBoxIndices As New List(Of Integer), NewTextBoxIndex = 0
    7. For i As Int32 = 0 To cnt - 1
    8. NewTextBoxIndex = rand.Next(mylist.Count)
    9. Do
    10. If Not ListOfAlreadyUsedTextBoxIndices.Contains(NewTextBoxIndex) Then ListOfAlreadyUsedTextBoxIndices.Add(NewTextBoxIndex): Exit Do
    11. Loop
    12. TextBox2.Text &= String.Format("{1}{0}", vbCrLf, mylist(NewTextBoxIndex).Text)
    13. Next
    Aufpassen, wenn es cnt > TextBox-Anzahl ist, dann gibt's ne Endlosschleife.
    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.

    VB.NET-Quellcode

    1. Dim cnt As Int32 = 10
    2. Dim ontime = Enumerable.Range(0, mylist.Count).OrderBy(Function(x) rand.Next()).ToArray
    3. For i As Int32 = 0 To cnt - 1
    4. TextBox2.Text &= String.Format("{1}{0}", vbCrLf, mylist(ontime(i)))
    5. Next


    Freundliche Grüsse

    exc-jdbi
    Ich bin ja gespannt, ob @patty das Durchschütteln der Liste tatsächlich versteht.
    Aber es reicht ja notfalls auch C&P.

    Vielleicht sollte man vor der Schleife noch die TextBox leeren, damit solche Effekte wie

    patty schrieb:

    jetzt bekomme ich doppelte texte
    bei mehrfachen Klicks nicht vorkommen.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --