PDA

Vollständige Version anzeigen : zwei dimensionales Array vermischen


ablage01
08.07.2014, 16:35
Hallo,

ich habe ein zwei dimensionales Array und ich möchte die erste Dimension komplett vermischen.


Array ist folgendermaßen definiert:
ReDim peoplearray (1 to 5, 1 to 3)


In der ersten Dimension ist an erster Stelle der String "Anton" und an letzter(5.) Stelle bspw. "Emil". Die zweiten Dimension umfasst Daten wie Geburtsdatum, Größe und Geschlecht jeweils zum Namen.

Jetzt möchte ich, dass an erster Stelle durch eine Shuffle-Funktion Emil auftaucht und an zweiter Stelle Anton etc.

Ich habe einen sehr interessanten codeausschnitt im Internet gefunden, allerdings für ein 1-dimensionales Array. Kriege es nicht hin dieses mit einer zwei dimensionalen zum Laufen zu bekommen.
Der Compiler meckert bei
"Arr(N) = InArray(N)" da es ja nicht einfach so die Elemente kopieren kann.

Habt ihr einen Tip?
Danke
Function ShuffleArray(InArray() As Variant) As Variant()
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ''''
' ShuffleArray
' This function returns the values of InArray in random order. The original
' InArray is not modified.
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ''''
Dim N As Long
Dim Temp As Variant
Dim J As Long
Dim Arr() As Variant


Randomize
L = UBound(InArray) - LBound(InArray) + 1
ReDim Arr(LBound(InArray) To UBound(InArray))
For N = LBound(InArray) To UBound(InArray)
Arr(N) = InArray(N)
Next N
For N = LBound(InArray) To UBound(InArray)
J = CLng(((UBound(InArray) - N) * Rnd) + N)
Temp = Arr(N)
Arr(N) = ARr(J)
Arr(J) = Temp
Next N
ShuffleArray = Arr
End Function

Nepumuk
08.07.2014, 17:24
Hallo,

teste mal:

<nobr><span style="font-family:Courier New,Arial; font-size:9pt ;" ><b><span style="color:#000080"; >Public</span> <span style="color:#000080"; >Function</span> ShuffleArray(<span style="color:#000080"; >ByRef</span> pravntInput() <span style="color:#000080"; >As</span> <span style="color:#000080"; >Variant</span>) <span style="color:#000080"; >As</span> <span style="color:#000080"; >Variant</span>()</b><br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#000080"; >Dim</span> ialngIndex1 <span style="color:#000080"; >As</span> Long, ialngIndex2 <span style="color:#000080"; >As</span> Long, lngRandom <span style="color:#000080"; >As</span> <span style="color:#000080"; >Long</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#000080"; >Dim</span> vntTemp <span style="color:#000080"; >As</span> Variant, avntOutput() <span style="color:#000080"; >As</span> <span style="color:#000080"; >Variant</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;Randomize<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#000080"; >Redim</span> avntOutput(<span style="color:#000080"; >LBound</span>(pravntInput, 1) <span style="color:#000080"; >To</span> <span style="color:#000080"; >UBound</span>(pravntInput, 1), _<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#000080"; >LBound</span>(pravntInput, 2) <span style="color:#000080"; >To</span> <span style="color:#000080"; >UBound</span>(pravntInput, 2))<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#000080"; >For</span> ialngIndex1 = <span style="color:#000080"; >LBound</span>(pravntInput, 1) <span style="color:#000080"; >To</span> <span style="color:#000080"; >UBound</span>(pravntInput, 1)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#000080"; >For</span> ialngIndex2 = <span style="color:#000080"; >LBound</span>(pravntInput, 2) <span style="color:#000080"; >To</span> <span style="color:#000080"; >UBound</span>(pravntInput, 2)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;avntOutput(ialngIndex1, ialngIndex2) = pravntInput(ialngIndex1, ialngIndex2)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#000080"; >Next</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#000080"; >Next</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#000080"; >For</span> ialngIndex1 = <span style="color:#000080"; >LBound</span>(pravntInput, 1) <span style="color:#000080"; >To</span> <span style="color:#000080"; >UBound</span>(pravntInput, 1)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lngRandom = <span style="color:#000080"; >Clng</span>(((<span style="color:#000080"; >UBound</span>(pravntInput, 1) - ialngIndex1) * Rnd) + ialngIndex1)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#000080"; >For</span> ialngIndex2 = <span style="color:#000080"; >LBound</span>(pravntInput, 2) <span style="color:#000080"; >To</span> <span style="color:#000080"; >UBound</span>(pravntInput, 2)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vntTemp = avntOutput(ialngIndex1, ialngIndex2)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;avntOutput(ialngIndex1, ialngIndex2) = avntOutput(lngRandom, ialngIndex2)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;avntOutput(lngRandom, ialngIndex2) = vntTemp<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#000080"; >Next</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#000080"; >Next</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;ShuffleArray = avntOutput<br />&nbsp;&nbsp;&nbsp;&nbsp;<br /><b><span style="color:#000080"; >End</span> <span style="color:#000080"; >Function</span></b><br /></span></nobr>

daolix
08.07.2014, 17:31
Hallo
Jetzt möchte ich, dass an erster Stelle durch eine Shuffle-Funktion Emil auftaucht und an zweiter Stelle Anton etc.
Mit einer Shuffle-Funktion ist aber nicht sichergestellt das Emil auch an erster Stelle auftaucht und Anton an Zweiter.
Das was ich aus diesem jetzt heraus lese ist das du das Array eher Rotieren lassen willst.
Aber ob nun mischen oder Rotieren, du must auch die Dimensionen beachten
Hier mal Luftcode
Function ShuffleArray(InArray() As Variant) As Variant()
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ''''
' ShuffleArray
' This function returns the values of InArray in random order. The original
' InArray is not modified.
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' '''
Dim N As Long
Dim Temp As Variant
Dim J As Long
Dim Arr() As Variant


Randomize
L = UBound(InArray) - LBound(InArray) + 1
Arr() = InArray()

For N = LBound(InArray) To UBound(InArray)
J = CLng(((UBound(InArray,1) - N) * Rnd) + N)
Temp = Arr(N,1)
Arr(N,1) = ARr(J,1)
Arr(J,1) = Temp
Next N
ShuffleArray = Arr
End Function

Alternativ könntest du aber auch ein IndexArray verwenden.

ablage01
09.07.2014, 08:13
Hallo,

teste mal:

<nobr><span style="font-family:Courier New,Arial; font-size:9pt ;" ><b><span style="color:#000080"; >Public</span> <span style="color:#000080"; >Function</span> ShuffleArray(<span style="color:#000080"; >ByRef</span> pravntInput() <span style="color:#000080"; >As</span> <span style="color:#000080"; >Variant</span>) <span style="color:#000080"; >As</span> <span style="color:#000080"; >Variant</span>()</b><br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#000080"; >Dim</span> ialngIndex1 <span style="color:#000080"; >As</span> Long, ialngIndex2 <span style="color:#000080"; >As</span> Long, lngRandom <span style="color:#000080"; >As</span> <span style="color:#000080"; >Long</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#000080"; >Dim</span> vntTemp <span style="color:#000080"; >As</span> Variant, avntOutput() <span style="color:#000080"; >As</span> <span style="color:#000080"; >Variant</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;Randomize<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#000080"; >Redim</span> avntOutput(<span style="color:#000080"; >LBound</span>(pravntInput, 1) <span style="color:#000080"; >To</span> <span style="color:#000080"; >UBound</span>(pravntInput, 1), _<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#000080"; >LBound</span>(pravntInput, 2) <span style="color:#000080"; >To</span> <span style="color:#000080"; >UBound</span>(pravntInput, 2))<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#000080"; >For</span> ialngIndex1 = <span style="color:#000080"; >LBound</span>(pravntInput, 1) <span style="color:#000080"; >To</span> <span style="color:#000080"; >UBound</span>(pravntInput, 1)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#000080"; >For</span> ialngIndex2 = <span style="color:#000080"; >LBound</span>(pravntInput, 2) <span style="color:#000080"; >To</span> <span style="color:#000080"; >UBound</span>(pravntInput, 2)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;avntOutput(ialngIndex1, ialngIndex2) = pravntInput(ialngIndex1, ialngIndex2)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#000080"; >Next</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#000080"; >Next</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#000080"; >For</span> ialngIndex1 = <span style="color:#000080"; >LBound</span>(pravntInput, 1) <span style="color:#000080"; >To</span> <span style="color:#000080"; >UBound</span>(pravntInput, 1)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lngRandom = <span style="color:#000080"; >Clng</span>(((<span style="color:#000080"; >UBound</span>(pravntInput, 1) - ialngIndex1) * Rnd) + ialngIndex1)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#000080"; >For</span> ialngIndex2 = <span style="color:#000080"; >LBound</span>(pravntInput, 2) <span style="color:#000080"; >To</span> <span style="color:#000080"; >UBound</span>(pravntInput, 2)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vntTemp = avntOutput(ialngIndex1, ialngIndex2)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;avntOutput(ialngIndex1, ialngIndex2) = avntOutput(lngRandom, ialngIndex2)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;avntOutput(lngRandom, ialngIndex2) = vntTemp<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#000080"; >Next</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#000080"; >Next</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;ShuffleArray = avntOutput<br />&nbsp;&nbsp;&nbsp;&nbsp;<br /><b><span style="color:#000080"; >End</span> <span style="color:#000080"; >Function</span></b><br /></span></nobr>
Ein Träumchen, sei bedankt :)

@daolix, danke auch, aber ich habe mich unglücklich ausgedrückt - ich wollte es komplett zufällig gemischt haben und nicht "nachgerückt".
Danke auch :)