|
|
|
|
Array mischen |
Zmaster
Junior Member
Dabei seit: 15.02.2003
Beiträge: 133
|
|
Array mischen |
|
|
|
16.05.2004 22:42 |
|
|
phlox81
Bote des Lichts und Moderator
Dabei seit: 19.10.2002
Beiträge: 3.028
Herkunft: Irgendwo im Nirgendwo
|
|
in c++ gibts randomshuffle, aber keine
Ahnung wie man das in Java macht.
Devil
__________________ Intelligenz ist eine Illusion des Menschen
phlox81.de | codenode.de
|
|
16.05.2004 23:20 |
|
|
Nightwolf
BlackBoarder
Dabei seit: 17.07.2003
Beiträge: 856
Herkunft: Hessen
|
|
du koenntest das mit if und Math.random machen
__________________ Wir ertrinken in Informationen und hungern nach Wissen. - John Naisbitt
|
|
16.05.2004 23:29 |
|
|
Zmaster
Junior Member
Dabei seit: 15.02.2003
Beiträge: 133
Themenstarter
|
|
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
|
|
16.05.2004 23:55 |
|
|
Medusa
Senior Member
Dabei seit: 10.09.2001
Beiträge: 356
Herkunft: ...von da, wo mein Haus wohnt...
|
|
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
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.
__________________ Grüßle, Medi
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Medusa: 17.05.2004 22:34.
|
|
17.05.2004 22:30 |
|
|
Zmaster
Junior Member
Dabei seit: 15.02.2003
Beiträge: 133
Themenstarter
|
|
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
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
|
|
18.05.2004 10:30 |
|
|
LX
El Comandante en Jefe
Dabei seit: 25.11.2001
Beiträge: 5.372
Herkunft: Berliner Bronx
|
|
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.
__________________ JS-Games.de - Misled Scripting Skills Gone Mad | Meine Filmkritiken | Urban Photography
Kommt mal in den IRC-Channel: irc.eu.freenode.net | Port 6667 | #blackboard
"Ever tried. Ever failed. No matter.
Try again. Fail again. Fail better."
- Samuel Beckett
|
|
18.05.2004 12:01 |
|
|
Romanticus
Member
Dabei seit: 08.03.2003
Beiträge: 280
Herkunft: ein Land, das in Deutschland nur wenige kennen
|
|
noch so ein blöder vorschlag, wie man ein array mischen könnte
- die idee hatte ich gestern vor dem einschlafen, so ne art geistesblitz
.
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
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.
__________________ Heute sterben die meisten Leute an einer Art schleichenden Menschenverstandes und entdecken zu spät, dass das Einzige, was wir nie bereuen, unsere Fehler sind. Oscar Wilde
Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von Romanticus: 18.05.2004 13:53.
|
|
18.05.2004 13:50 |
|
|
LX
El Comandante en Jefe
Dabei seit: 25.11.2001
Beiträge: 5.372
Herkunft: Berliner Bronx
|
|
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.
__________________ JS-Games.de - Misled Scripting Skills Gone Mad | Meine Filmkritiken | Urban Photography
Kommt mal in den IRC-Channel: irc.eu.freenode.net | Port 6667 | #blackboard
"Ever tried. Ever failed. No matter.
Try again. Fail again. Fail better."
- Samuel Beckett
|
|
18.05.2004 13:58 |
|
|
Romanticus
Member
Dabei seit: 08.03.2003
Beiträge: 280
Herkunft: ein Land, das in Deutschland nur wenige kennen
|
|
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
__________________ Heute sterben die meisten Leute an einer Art schleichenden Menschenverstandes und entdecken zu spät, dass das Einzige, was wir nie bereuen, unsere Fehler sind. Oscar Wilde
|
|
18.05.2004 14:34 |
|
|
phlox81
Bote des Lichts und Moderator
Dabei seit: 19.10.2002
Beiträge: 3.028
Herkunft: Irgendwo im Nirgendwo
|
|
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
__________________ Intelligenz ist eine Illusion des Menschen
phlox81.de | codenode.de
|
|
18.05.2004 14:43 |
|
|
|
|
|
|