Array mischen

  • Hallo zusammen

    Ich hoffe ihr könnt helfen.
    Ich versuche irgendwie einen Array zu "mischen" um eine zufällige Reihenfolge der werte zu bekommen.
    Der Array ist bereits befüllt und sieht mit _ArrayDisplay so aus:

    [0] 5
    [1] Wert1
    [2] Wert2
    [3] Wert3
    [4] Wert4

    Rauskommen soll hinterher sowas:

    [0] 5
    [1] Wert4
    [2] Wert1
    [3] Wert2
    [4] Wert3

    Hab keine Ahnung, wie ich das hinbekommen soll.  :cursing:
    Hat jemand eine Idee?

    Gruß,
    Matthias

    "Ausdauer wird früher oder später belohnt – meistens aber später" (Wilhelm Busch)

    Einmal editiert, zuletzt von matthias.s (5. Februar 2013 um 13:44)

  • Bitte sehr:

    [autoit]

    #include <Array.au3>

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

    Global $aTest[9] = [1,2,3,4,5,6,7,8,9]

    [/autoit][autoit][/autoit][autoit]

    _ArrayMixup($aTest)

    [/autoit][autoit][/autoit][autoit]

    _ArrayDisplay($aTest)

    [/autoit][autoit][/autoit][autoit]

    Func _ArrayMixup(ByRef $aArray)
    $iBound = UBound($aArray)-1
    For $i = 0 To $iBound
    $iMarker = Random(0,$iBound,1)
    If $i <> $iMarker Then
    $nBackup = $aArray[$iMarker]
    $aArray[$iMarker] = $aArray[$i]
    $aArray[$i] = $nBackup
    EndIf
    Next
    EndFunc

    [/autoit]

    Du musst dir noch die Anzahl einfügen.

  • Der Lösungsansatz ist schon super.

    Allerdings ist in meinem Array in Zeile 0 die Größe des Arrays gespeichert.
    Die sollte natürlich nicht mit "gemischt" werden sondern in Zeile 0 bleiben.

    Noch ne Idee, wie ich die überspringen kann?

    Gruß,
    Matthias

    "Ausdauer wird früher oder später belohnt – meistens aber später" (Wilhelm Busch)

  • [autoit]

    Func _ArrayMixup(ByRef $aArray)
    _ArrayDelete($aArray, 0)
    $iBound = UBound($aArray)-1
    For $i = 0 To $iBound
    $iMarker = Random(0,$iBound,1)
    If $i <> $iMarker Then
    $nBackup = $aArray[$iMarker]
    $aArray[$iMarker] = $aArray[$i]
    $aArray[$i] = $nBackup
    EndIf
    Next
    _ArrayInsert($aArray, 0, $iBound+1)
    EndFunc

    [/autoit]

    Ein Blick in die Hilfe sagt dir alles ^^

  • PERKEKT :thumbup:

    Tausend Dank

    (das: "Du musst dir noch die Anzahl einfügen." hatte ich überlesen, Sorry  :whistling:

    "Ausdauer wird früher oder später belohnt – meistens aber später" (Wilhelm Busch)

  • minx:
    Wieso gleich nicht so?

    [autoit]

    Func _ArrayMixup(ByRef $aArray)
    $iBound = UBound($aArray)-1
    For $i = 1 To $iBound ;// Zu "1" gesetzt!
    $iMarker = Random(1, $iBound, 1) ;// 1. Parameter zu "1" gesetzt!
    If $i <> $iMarker Then
    $nBackup = $aArray[$iMarker]
    $aArray[$iMarker] = $aArray[$i]
    $aArray[$i] = $nBackup
    EndIf
    Next
    EndFunc

    [/autoit]

    Bei größeren Arrays ist es doch schneller anstatt nochmal ein Funktionsaufruf vorzunehmen? z.B. Bei einem Index von 1.000.000
    Wenn ich mich nicht irre macht dies genau was gewünscht wird. Oder sehe ich das falsch :o?
    [Ich frage mich nur gerade wieso du das so "umständlich" machst ...]


  • Das dachte ich mir vorher auch, war aber mit dem Handy on und konnte deshalb nicht antworten... Würde mich auf jeden Fall auch interessieren :)

    Da es hier doch einige falsch machen:

    Zitat von einem User dieses Forums

    Die Standard-Standart eines Flamingos ist einbeinig. ;)

  • Die Funktion wollte ich nicht antasten, weil jemand anders sie auch noch brauchen könnte ;). Die Anzahl im Nullten Element ist doch nur spezifisch für ihn wichtig. Kann man machen wie man will ^^