Per Zufall einen Satz kopieren?

  • VB.NET

Es gibt 24 Antworten in diesem Thema. Der letzte Beitrag () ist von TVX.

    Per Zufall einen Satz kopieren?

    Hallo ich habe eine Frage,

    und zwar möchte ich einen Satz per zufall in eine Worddatei schreiben.
    Das auslesen der txt datei habe ich, und ich lasse es gleich in eine Listbox einfügen.

    Nun möchte ich, dass er per Zufall einen Satz nimmt und in einen Textmarker kopiert.

    Die Funktion um in eine Worddatei zu schreiben habe ich, jedoch wie ich per Zufall die Dateien da rein kopiert weiß ich nicht...
    Ich wollte auch, dass ein Satz nicht zwei mal in der Wortdatei vorkommt.

    Kann mir jemand da helfen?

    Lg
    TiTo
    Danke dir!

    Der Code

    VB.NET-Quellcode

    1. TextBox1.Text = ListBox1.Items.Item(New Random().Next(0, ListBox1.Items.Count))


    hat mir geholfen! Jedoch habe ich nun das Problem das die Texte mehrmals in der Worddatei nun eingetragen wurden...
    Kann man das evtl. umgehen? Oder prüfen?

    Lg
    TiTo
    Speicher doch einfach in einer temp Variablie bzw. Array alle Sätze, die du schon hinzugefügt hast.
    Solltest du es mit einem Array machen könntest du es mit einer Schleife durchlaufen und prüfen ob der Satz schon hinzugefügt worden ist.
    Okay Schnittcher, klingt logisch bzw. Hilfreich!

    Nur habe ich grade ein Problem.
    Wie finde ich raus was ich grade eben eingetragen habe?

    Mein Code sieht folgendermaßen aus:

    VB.NET-Quellcode

    1. For i = 2 To 6
    2. doc.Bookmarks().Item("Text" + i.ToString).Range.Text = ListBox1.Items.Item(New Random().Next(0, ListBox1.Items.Count))
    3. Next


    Möchte noch hinzufügen, das ich das abgefragte in eine Listbox packen möchte!

    //EDIT:

    Entschuldigung für meine dummen fragen....

    Lösung:

    VB.NET-Quellcode

    1. For i = 2 To 6
    2. Dim Abfrage As String = ListBox1.Items.Item(New Random().Next(0, ListBox1.Items.Count))
    3. doc.Bookmarks().Item("Text" + i.ToString).Range.Text = Abfrage
    4. ListBox2.Items.Add(Abfrage)
    5. Next


    Danke das ihr mir hilft ! :)
    So ich habe dir mal ein kleines Besipiel zusammengetippt:

    VB.NET-Quellcode

    1. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    2. For i As Integer = 1 To 10
    3. ListBox1.Items.Add(i)
    4. Next
    5. End Sub
    6. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    7. For Each wert In ListBox1.Items
    8. MessageBox.Show(wert)
    9. Next
    10. End Sub


    Beim Form1_Load fülle ich die ListBox1 das ist ja sicherlich klar.

    Beim Button1_Click da laufe ich mit einer Schleife durch die ListBox1! So könntest du nun prüfen ob dein Zufallssatz, den du nun hinzufügen willst schon vorhanden ist oder nicht.
    Okay danke!

    Habe wieder nun ein Problem und zwar wie gebe ich dem Word parser nun jede einzelne Zeile der Listbox2 ?

    Mein Code sind folgend aus:


    VB.NET-Quellcode

    1. ListBox2.Items.Clear()
    2. While ListBox2.Items.Count < 10
    3. ListBox2.Items.Add(ListBox1.Items.Item(New Random().Next(0, ListBox1.Items.Count)))
    4. RemoveDuplicateItem(ListBox2)
    5. End While

    VB.NET-Quellcode

    1. For i = 2 To 6 ' Von Zeile 2 - Zeile 6 soll er jeweils einen Satz ausgeben
    2. For Each wert In ListBox2.Items
    3. doc.Bookmarks().Item("Text" + i.ToString).Range.Text = wert
    4. Next
    5. Next


    Dies klappt leider nicht, weil er dann den kompletten Inhalt in einen Textmarker kopiert...
    Das Thema hat sich erledigt TiTo hat micht gestern noch per ICQ angeschrieben.

    Lösung:
    Sobald ein Satz aus der ListBox in das Dokument übertragen worden ist, wird der Satz aus der Listbox gelöscht.
    Wenn das Dokument geschrieben wurde, wird die ListBox komplett geleert und wieder neu gefüllt.
    So können keine Sätze mehr doppelt in dem Dokument landen.
    Die "schöne" Lösung sieht in etwa so aus

    l = list(of String)
    r = new random
    durcheinander = from each s as string in l order by r.next select s

    for i = 1 to anzahl
    insert(durcheinander(i-1)
    next i

    Man braucht dann auch die Liste nicht löschen und neu befüllen, da sie ja einfach bei jedem Durchlauf nur durcheinandergewürfelt wird.
    Hallo liebe Community,

    ich sitze wieder vor dem gleichen Problem...
    Mir fällt einfach keine logische Lösung für das Problem.

    Er nimmt aus Listbox1 die Items und belegt doppelt die Listbox2. Ich möchte aber das er diese ohne Duplikate belegt...
    Könnte mir da bitte jemand wieder helfen? Habe meinen alten Source Code bei einem HDD Crash verloren ;(

    So sieht derzeit mein Weg aus.

    VB.NET-Quellcode

    1. For i = 1 To 6
    2. Dim Abfrage As String = ListBox1.Items.Item(New Random().Next(0, ListBox1.Items.Count))
    3. doc.Bookmarks().Item("Text" + i.ToString).Range.Text = Abfrage
    4. ListBox2.Items.Add(Abfrage)
    5. Next

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click Keinen doppelten eintrag zulassen
    2. NeuesItem = TextBox1.Text
    3. AdditemToListbox()
    4. End Sub
    5. Sub AdditemToListbox()
    6. If Not ListBox1.Items.Contains(NeuesItem) Then
    7. ListBox1.Items.Add(NeuesItem)
    8. End If
    9. End Sub
    10. End Class

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „TVX“ ()

    Okay vielen Dank.
    Aber wenn ich das so löse:

    VB.NET-Quellcode

    1. For i = 1 To 6
    2. Dim Abfrage As String = ListBox1.Items.Item(New Random().Next(0, ListBox1.Items.Count))
    3. If Not ListBox2.Items.Contains(Abfrage) Then
    4. ListBox2.Items.Add(Abfrage)
    5. End If
    6. Next


    Dann trägt er nur einen Wert ist die Listbox2.

    Wenn ich aber dann noch jeden Wert aus Listbox2 ausgeben möchte, dann füllt er die Listbox2 mit 6 Werten aber die Msgbox spinnt und zeigt mir Dupliakte...

    VB.NET-Quellcode

    1. For i = 1 To 6
    2. Dim Abfrage As String = ListBox1.Items.Item(New Random().Next(0, ListBox1.Items.Count))
    3. If Not ListBox2.Items.Contains(Abfrage) Then
    4. ListBox2.Items.Add(Abfrage)
    5. End If
    6. For Each wert In ListBox2.Items
    7. MsgBox(wert)
    8. Next
    9. Next
    finktioniert das überhaupt mit

    VB.NET-Quellcode

    1. If Not ListBox2.Items.Contains(Abfrage) Then

    muss das nicht mit

    VB.NET-Quellcode

    1. for each item

    geprüft werden ?
    Ich kanns gerade nicht testen und ich denke, den Eintrag aus der Listbox zu entfernen, wenn er benutzt wurde ist eh der Sichere und beste Weg...
    Du bist der Gott, der Götter! Ich danke dir vielmals!

    Kannst du mir evtl. noch sagen, wie ich nun jedes einzelne Item ausgeben kann?

    VB.NET-Quellcode

    1. For Each wert In ListBox2.Items
    2. doc.Bookmarks().Item("Text" + i.ToString).Range.Text = wert
    3. Next


    Weil so, gibt er mir jedes mal immer eins mehr hinzu. anstatt nur eins.
    Ist dir schon mal aufgefallen das das du nimals auf die Zahl kommen wirst die du willst ^^ (( For i = 1 to 5 )) ^^

    Random verursacht dopels das heißt eine Zeile wird unter Umständen 2 bis 3 mal aufgerufen :!:

    Du verpasst dir selber ne menge doppelte Einträge,die dann wiederum durch das blocken der selbigen
    ein unötig schlechtese Ergebniss bringen ! :D
    Hm aber ich bräuchte schon eine For Schleife für meine Textmarken in Word.

    VB.NET-Quellcode

    1. For i = 1 To 5
    2. Dim Abfrage As String = ListBox1.Items.Item(New Random(i).Next(0, ListBox1.Items.Count))
    3. ListBox2.Items.Add(Abfrage)
    4. For Each item In ListBox2.Items
    5. If Not ListBox2.Items.Contains(item) Then
    6. ListBox2.Items.Add(Abfrage)
    7. End If
    8. Next
    9. Next


    So bekomme ich jedenfalls keine Doppelten Werte mehr, aber wenn ich mehrmals auf den Button drücke, dann ist das eben nicht mehr Random sondern liefert die gleichen Werte wieder aus.
    Wie löse ich das mit dem Random am besten nun?