Array mischen

  • VB.NET

Es gibt 17 Antworten in diesem Thema. Der letzte Beitrag () ist von foxm2k.

    Array mischen

    Hey,
    gibt es eine Funktion um alle Einträge eines Arrays zu mischen? Wenn nicht, wie würdet ihr einen Array mischen?
    Wäre cool, wenn jemand einen Beispielcode hätte :)

    Danke für eure Hilfe

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

    Aso stimmt sry, hab da was vergessen euch zu sagen ... ich habe 2 Arrays :)
    Beide Arrays sollen gleich gemischt werden. Der sinn davon ist dass ich ein Vokabelprogramm habe und dort die Wörter nicht immer in der gleichen Reihenfolge abgefragt werden sollen :)
    Hi Eisvogel,

    so wie MAAN10 es geschrieben hat ist es denke ich am einfachsten, nochmal bissel ausfürlicher:

    sagen wir du hast 2 Array einmal strVokabel(100) und einmal strLösung(100)

    dann erzeugst du eine zufallszahl zwischen 1 und 100 und fragst dann mit deinem Programm den Benutzer nach der vokabel strVokabel(zufallszahl)

    du musst die Arrays ja nicht von 1-100 in der Reihenfolge abfragen.

    dann könntest du in ein weiteres Array speichern, welche zahlen schon gefragt wurden und gegebenenfalls neu Würfeln..


    MfG Sepp
    Unter den Suchbegriffen hättest du ne Menge mehr gefunden, z.B. so etwas:

    VB.NET-Quellcode

    1. Public Sub ArrRnd(ByRef sArray() As String)
    2. For i As Integer = 0 To sArray.GetUpperBound(0) - 1
    3. Dim k = CInt(i + 1 + CInt(sArray.GetUpperBound(0) - (i + 1)) * Rnd())
    4. Dim s = sArray(i)
    5. sArray(i) = sArray(k)
    6. sArray(k) = s
    7. Next
    8. End Sub


    f0x
    Also 2 Arrays is unsinnig, ich würde dir da auch zu einem Array mit eigener Klasse raten.

    VB.NET-Quellcode

    1. Public Class Vokabel
    2. Public Englisch As String
    3. Public Deutsch As String
    4. End Class
    5. Dim NeuesArray As New List(Of Vokabeln)


    Dann halt die Liste füllen mit

    VB.NET-Quellcode

    1. Dim Eintrag As Vokabeln
    2. Eintrag.Deutsch = "Gehen"
    3. Eintrag.Englisch = "to go"
    4. NeuesArray.Add(Eintrag)


    und so weiter. Später machst du ein weiteres Array vom selben Datentyp und dann eine Do While Schleife wo die Einträge des ersten, gefüllten Arrays ausliest via Randomize, als Grenze eben von Minimal bis Länge des Arrays. Sobald ein Element Ausgewählt wurde wird dieses Element aus dem bestehenden gefüllten Array in das Array gepackt, wo sie gemsicht sein sollen, im gleichen Zug wird das gewählte Element gelöscht, damit wird das eine Array immer kleiner bis am ende nur noch 1 eintrag drin ist.

    So würde ich es machen.
    So ich habs endlich geschafft :)

    Quellcode

    1. Private Sub Wörter_mischen()
    2. Dim Zufall As New Random
    3. Dim Zahl1 As Double
    4. Dim Zahl2 As Double
    5. Dim Wort1 As String
    6. Dim Wort2 As String
    7. 'Erstellt 2 zufällige Zahlen in der größe des Arrays
    8. Zahl1 = Zufall.Next(0, Wörter1.Length)
    9. Zahl2 = Zufall.Next(0, Wörter1.Length)
    10. 'Vertauscht 2 Wörter des 1. Arrays
    11. Wort1 = Wörter1(Zahl1)
    12. Wort2 = Wörter1(Zahl2)
    13. Wörter1(Zahl1) = Wort2
    14. Wörter1(Zahl2) = Wort1
    15. 'Vertauscht 2 Wörter des 2. Arrays
    16. Wort1 = Wörter2(Zahl1)
    17. Wort2 = Wörter2(Zahl2)
    18. Wörter2(Zahl1) = Wort2
    19. Wörter2(Zahl2) = Wort1
    20. End Sub


    Dieser code micht mir die beiden Arrays "Wörter1" und "Wörter2".
    Beide werden genau gleich gemischt, so dass die übertetzung immernoch stimmt ;)
    Jedoch habe ich ein Problem mit der umsetzung in meinem Programm :)
    Ich frage die Funktion über eine While Schleife ab, so dass ich eintellen kann wie oft die Wörter gemischt werden sollen:

    Quellcode

    1. 'Mischt die Wörter -> Anzahl gbit die Anzahl der Mischvorgänge an
    2. Dim Anzahl As Double = 10
    3. While Anzahl > 0
    4. Wörter_mischen()
    5. Anzahl -= 1
    6. MsgBox(Wörter1(5))
    7. End While


    Wenn ich dabei die MsgBox weglasse funktioniert das ganze irgendwie net ... der Sub Mischen wird zwar ausgeführt, mischt auch die Wörter, aber sobald die While Schleife zu Ende ist, sind die wörter wieder in der Grundreihenfolge ...
    Das ist irgendwie voll seltsam ... kann mir jemand helfen?

    Danke für eure Hilfe
    Hat es einen bestimmten Grund daß du fertige Funktionen nicht verwenden willst? In dem Fall wäre eine Copy&Paste einer ausgereiften Sub evtl. doch die bessere Lösung. Hat es außerdem einen bestimmten Grund, warum du denkst daß mehrmaliges mischen den "Zufall erhöht"?

    f0x
    Danke für deine Antwort, jedoch beantwortet das nicht meine Frage.
    Was du mit Copy&Paste meinst verstehe ich nicht und wegen den mehrmaligen mischen, wenn du dir den Code genau angeschaut hättest, hättest du bemerkt, dass bei dem Mischvorgang immer nur 2 Wörter vertauscht werden, also der rest bleibt gleich, das wäre eine ziemlich uneffektive art des mischens.

    Und sowas von einem SuperMod ...
    Na, mal ganz ruhig bleiben. Ich wollte dir damit aufzeigen daß du in der Logik falsch unterwegs bist. Du verteilst deine Mischlogik auf zwei Programmteile, was ziemlich schlechter Stil ist. Außerdem stellt sich mir dabei die Frage wie du ganz allgemein bestimmst wie oft du vertauschen willst, bis du davon ausgehst daß du die gewünschte Entropie in deinem Array erreicht hast. Daher die Frage ob du glaubst daß du mit mehrmaligem Mischen zufälliger unterwegs zu sein. Da du offenbar mehr prozedural als objektorientiert denkst hab ich dir vorgeschlagen das ganze in eine sub in ein Modul auszulagern. Dazu hab ich dir schon eine Möglichkeit gepostet (die du anscheinend überlesen hast). Zumindest hab ich nicht gesehen daß du dich damit auseinander gesetzt hast. Trotz all dieser Unzulänglichkeiten die ich erkenne, versuche ich auf einer sachlichen Ebene zu antworten und möchte dich um selbiges bitten. Spar dir bitte solche Kommentare in Zukunft. Du solltest nicht vergessen daß du es bist der Fragen hat und Hilfe sucht, daher solltest vor allem _du_ freundlich bleiben und versuchen zu verstehen was man dir antwortet.

    Grüße,

    f0x
    Sry, ich habe deine Beitrag schon gelesen, jedoch nicht verstanden ^^
    Das es schlehter Stile ist, die Mischlogik auf 2 Programmteile zu verteilen sollte ja eigentlich nichts am Ergebnis ändern.
    Ich habe jetzt die While schleife in den mischen Sub mit hinein gepackt und nun geht es.
    falls jemand weiß warum es dovor niht ging wäre ich sehr dankbar :)
    Die Mischvorgänge habe ich jetzt auch abhängig von der Anzahl der Wörter gemacht ;)
    Die Empfehlung für die Verwendung des Typs random lautet: Einmal instanzieren, dann mit .next jeweils verwenden. Was du gemacht hast war folgendes: Du hast in einer schleife mit new random jeweils sehr schnell hintereinander neue Objekte instanziert (Aufgrund deiner Verkettung der zwei Teile). Es ist bekannt daß dies aufgrund der Art und Weise wie der Seed ermittelt wird dazu führen kann daß die produzierten Zahlen nicht mehr zufällig sind sondern sich wiederholen. Je nachdem wie du die Schleife also jetzt in deine Mischlogik integriert hast, ist das Ergebnis eben gerade _nicht_ dasselbe wie in dem Beispiel daß du davor gepostet hast. Und das hast du ja auch schon selbst bemerkt.

    f0x