BlackBoard (http://www.black-board.net/index.php)
- Design, Programmierung & Entwicklung (http://www.black-board.net/board.php?boardid=55)
-- Programmieren (http://www.black-board.net/board.php?boardid=4)
--- Java Array mischen (http://www.black-board.net/thread.php?threadid=17294)


Geschrieben von Zmaster am 16.05.2004 um 22:42:

Fragezeichen Array mischen




Geschrieben von phlox81 am 16.05.2004 um 23:20:

 

in c++ gibts randomshuffle, aber keine
Ahnung wie man das in Java macht.

Devil



Geschrieben von Nightwolf am 16.05.2004 um 23:29:

 

du koenntest das mit if und Math.random machen



Geschrieben von Zmaster am 16.05.2004 um 23:55:

 

Ich kann doch nicht mit Random die Reihenfolge bestimmen lassen.
Da kommen doch dann irgendwann Elemente doppelt vor, bzw. er lässt welche weg. Und dann mit if zu kontrollieren, welche fehlen und welche noch ergänzt werden, scheint mir nicht sehr sinnvoll.
Ich merke schon, ich muss mir wirklich eine shuffle Funktion schreiben. Trotz erfolgloser Suche mit Google, habe ich die Hoffnung nicht aufgegeben, dass schon eine entsprechende Funktion gibt.

Ok, wie erstelle ich mit einer Funktion eine Liste mit n Elementen in zufälliger Reihenfolge? Ich glaube, jetzt sind Mathematiker mit Fähigkeiten in der Komplexität gefragt (ich sag nur Mandelbrot).

Gruß
zmaster



Geschrieben von Medusa am 17.05.2004 um 22:30:

 

wenn du nicht prüfen willst, welche elemente schon vorhanden sind, dann versuch doch ein paar mal (zufällig oft) 2 zufällige elemente miteinander zu tauschen.

ich kann leider kein java. Aber die syntax is ja mal wurscht:

n sei letzte element,
rand ist ne zufahlszall (math.rand()) zwischen 0 und 1, jedes mal anders,
a sei das array

code:
1:
2:
3:
4:
5:
6:
7:
8:
j=runden(rand*20)
for (i=0; i<j; i++) {
    x=runden(rand*n)
    y=runden(rand*n)
    tmpX=a[x]
    a[x]=a[y]
    a[y]=tmpX    
}


runden() soll die Zahl auf eine Ganzzahl runden. Einfach ersetzen durch math.round() oder int() oder floor() oder weiß der Geier großes Grinsen

Ich weiß net wie des mit den Zufallszahlen aussieht. Wenn 2x direkt hintereinander eine Zufallszahl (abhängig von der Zeit) generiert wird, bin ich mir net sicher, ob die dann so zufällig sind. Einfach mal testen.



Geschrieben von Zmaster am 18.05.2004 um 10:30:

 

Endlich mal ein vernünftiger Vorschlag!

Auf diese Idee bin ich selber auch nicht gekommen, sondern hat mich jemand gebracht. Ich nehme auch an, dass intern so die shuffle-Funktionen arbeiten. Allerdings würde ich mir auch Sorgen machen über die zwei direkt hintereinander erzeugten Zufallszahlen. Desto langsamer der Computer ist, desto besser arbeitet vielleicht die Funktion Augenzwinkern

Meine Lösung sieht inzwischen anders aus. Ich habe mein Array in eine Liste umkonvertiert und diese kann mit shuffle gemischt werden.
Und danach habe ich die Liste in ein Array (über dem Umweg des Objects) zurück konvertieren.
Das ist die Lösung, die ich genommen habe, weil ich mir dann sicher sein kann, dass es dann halbwegs gut gemischt ist.

Gruß
zmaster



Geschrieben von LX am 18.05.2004 um 12:01:

Achtung

Ein Randomizer spuckt zwar nur Pseudozufallszahlen aus, die nach einem Algorithmus bestimmt werden, allerdings kannst du schon davon ausgehen, dass in aufeinanderfolgenden Zeiteinheiten nicht aufeinanderfolgende Zufallszahlen erzeugt werden. Die Zufalls-Algorithmen setzen auf ein Höchstmaß an Konfusion in der Berechnung der Zahlen.



Geschrieben von Romanticus am 18.05.2004 um 13:50:

 

noch so ein blöder vorschlag, wie man ein array mischen könnte Augenzwinkern - die idee hatte ich gestern vor dem einschlafen, so ne art geistesblitz smile .

da ich mit der java-syntax noch nicht sehr gut vertraut bin, und keine lust hab nachzuschauen, beschreibe ich einfach mal die vorgansweise.

man geht jedes element des arrays mit einer schleife durch. für jedes element wird eine zufallszahl zwischen 1 und n (100, 1000 etc.) generiert. wenn die zufallszahl gerade ist, wird das element an den anfang eines temporären arrays geschrieben, und wenn nicht - ans ende. zum schluss wird das ursprungsarray durch das temporäre ersetzt.
so wie ich das sehe, ist die methode recht "zufällig", bloß bin ich mir nicht ganz im klaren ob der "zufälligkeitsfaktor" proportional zur anzahl der potenziellen möglichkeiten wächst. Die wahrscheinlichkeit, dass eine gerade zahl generiert wird, ist ja unabhängig von n immer 50%. Andersrum, wenn n0=1 und n=2, dann ist die absolute wahrscheinlichkeit immer noch 50%, aber die relative um ein vielfaches höher (oder nicht?), das heißt, bei zwei zahlen ist die wahrscheinlichkeit größer, dass eine und diesselbe zahl mehrmals nacheinader kommt. Das ist zwar immer noch zufallsbasiert, erscheint uns aber logisch, da die möglichkeiten radikal geschrumpft sind.
Das könnte eine interessante diskussion geben smile

P.S. Ich weiß nicht ob es in Java fertige funktionen gibt, um elemente ans ende bzw. anfang des array hinzuzufügen. Schau mal in der docu nach dem paket java.lang.reflect das unter anderem die Klasse zur array-bearbeitung umfasst.



Geschrieben von LX am 18.05.2004 um 13:58:

 

Diese Methode ist aber IMHO net all zu zufällig, da du ja die Array-Elemente der Reihe nach durchgehst und nur einige herauspickst und sie an den Anfang schiebst. Die Elemente am Anfang sind dann aber immer noch mehr oder weniger absteigend sortiert.

Hier ist BTW eine Seite, die sich mit diesem Array-Misch-Problem beschäftigt.



Geschrieben von Romanticus am 18.05.2004 um 14:34:

 

shit... stimmt... das hab ich übersehen... bis zum ersten element des ursprungsarrays gehts absteigend und danach wieder aufsteigend... naja.. dann muss ich mir was anderes einfallen lassen smile



Geschrieben von phlox81 am 18.05.2004 um 14:43:

 

Mal ein entwurf:
code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
init_random() // zufallszahlen durch zb. Zeit intialisieren

for(int i =0; i < array_laenge * durchläufe; i++)
{
int x rand()%array_laenge -1;
int y rand()%array_laenge -1;
tausche(array[x],array[y]);
} 


So müsstest du das dann ungefähr machen.
Ist zwar nicht sehr performant, mixt aber das array
ordenlich durch.

Devil


Forensoftware: Burning Board 2.3.6, entwickelt von WoltLab GmbH