| |||||||
Du magst keine Werbung? Wir auch nicht!
Einfach registrieren und die Werbung ist weg. Diese Nachricht sehen nur nicht registrierte Nutzer.
![]() |
| | LinkBack | Themen-Optionen | Ansicht |
| | #1 (permalink) |
| copy Registriert seit: Jul 2004 Ort: Hamburch
Beiträge: 301
|
Hallo, zum Theman "array mischen" gibt es ja einiges* hier zu finden. Nun möchte ich aber ein Array so "gründlich" mischen, dass KEIN einziges Element nach dem Mischen an der Stelle ist (bzw. sein könnte), an der es vorher war. Jedes Element muss also ZWINGEND einen neuen Platz bekommen. Wenn jemand eine Idee hat wär das super! Meine jetzige Lösung sieht so aus, dass die Mischfunktion so lange neu ausgeführt wird, bis o.g. Bedingung erfüllt ist - das scheint mir aber weder elegant, noch schnell. *) Ich hätte mal wieder gleich hier suchen sollen und mir nich ne Mischfunktion selberschreiben sollen, die ich jetzt wieder übern haufen werfe.. naja. |
| | |
| | #2 (permalink) |
| helpQLODhelp Registriert seit: Feb 2002 Ort: Köln
Beiträge: 8.505
|
Das Problem ist interessant. Ein erster Ansatz könnte sein, erstmal beliebig zu mischen und dann zu prüfen, welche Positionen noch unverändert sind. Jetzt kannst du diese Elemente gegeneinander vertauschen, bis alle auf neuen Positionen sind. Auf die Art bleiben die korrekt gemischten Einträge auf jeden Fall korrekt gemischt. Könnte klappen, probiers mal. Edit: Ja, genau ![]() Wenn du mehr als einen falsch positionierten Eintrag findest, dann könntest du einfach alle falschen Elemente jeweils zur Positionen des nächsten falschen Eintrags verschieben, quasi ein Ringtausch. Dann sind alle auf jeden Fall an neuen korrekten Positionen. Es gibt nur einen Spezialfall, nämlich wenn nur ein Element falsch ist. Den musst du besonders behandeln. Du musst dann ein, eigentlich schon okayes Element finden, das du mit dem falschen Element vertauschen kannst, ohne die Unordnung zu zerstören. mfg. r.
__________________ Ralf Bokelberg™ - Flex & Flash Consulting Geändert von bokel (12-02-2005 um 23:48 Uhr) |
| | |
| | #3 (permalink) |
| God made me funky.. Registriert seit: Apr 2003 Ort: Bremen
Beiträge: 1.067
|
Keine falschen Lorbeeren für mich ![]() ActionScript:
__________________ Kunst ist in erster Linie eine Frage der Form und nicht des Inhalts Paul Rand Geändert von e2e4 (12-02-2005 um 23:58 Uhr) |
| | |
| | #4 (permalink) |
| helpQLODhelp Registriert seit: Feb 2002 Ort: Köln
Beiträge: 8.505
|
Eine andere Möglichkeit wäre es, immer nur erlaubte Vertauschungen durchzuführen. Eine Vertauschung ist erlaubt, wenn anschliessend beide Tauschpartner auf erlaubten Plätzen stehen. Dann muss man nur sicherstellen, dass alle mindestens einmal vertauscht worden sind. @e2e4: Oder so ![]() Edit: Allerdings scheint es noch nicht ganz zu stimmen. Jedenfalls kann es anscheinend passieren, dass die letzte Zahl stehen bleibt. Ich schätze, es muss j = random(i) heissen, anstatt i+1 mfg. r.
__________________ Ralf Bokelberg™ - Flex & Flash Consulting Geändert von bokel (13-02-2005 um 00:24 Uhr) |
| | |
| | #5 (permalink) |
| Freizeitflasher Registriert seit: Jun 2004 Ort: Niederösterreich
Beiträge: 615
| kleiner Code fehler
Idee: Immer ein zufälliges Element in ein freies Feld in einem neues Array kopieren, ausser bei gleichem Index. Hab jetzt eine knappe Stunde dafür gebraucht was ich in 20 Sekunden schreiben wollte: ![]() PHP-Code: Wenn die Arrays länger sind kommt das selten vor. bei 2 Elementen gar nie! Bei 3 Elementen kommt es schon öfter vor! Er setzt dann zB. [0] auf [1], [1] auf [0], und dann is nix mehr frei für [2], weil das ja nur mehr [2] frei ist! Wegen dieser Ausnahme hab ich auch so lang gebrauch! So bitte! Gute nacht! hier nochmal der Code in einer netten Funktion, ohne lästige Kommentare: PHP-Code: Hier noch eine nette Prototype Methode: Code: Array.prototype.shuffleAll = function(){
var ta=[], i;
for(var i=0;i<this.length;i++){
if(this[i]==undefined){
return undefined;
}else if(i==this.length-1 && ta[i]==undefined){
ta = [];
i = -1;
}else{
do{
ti = random(this.length);
}while(ti==i || ta[ti]!=undefined);
ta[ti] = this[i];
}
}
for(i in ta)this[i] = ta[i];
} Geändert von Alphanimal (13-02-2005 um 00:57 Uhr) Grund: Prototype! |
| | |
| | #6 (permalink) |
| God made me funky.. Registriert seit: Apr 2003 Ort: Bremen
Beiträge: 1.067
|
@bokel: *hmpfr* muß ich ja nochmal ran ActionScript:
__________________ Kunst ist in erster Linie eine Frage der Form und nicht des Inhalts Paul Rand Geändert von e2e4 (13-02-2005 um 00:42 Uhr) |
| | |
| | #7 (permalink) |
| Freizeitflasher Registriert seit: Jun 2004 Ort: Niederösterreich
Beiträge: 615
|
da kommt z.B. 0,2,3,1 raus! 0 darf nicht an erster stelle stehen weil jedes Element einen neuen Platz bekommen soll! das is ja das Problem Edit: Ups mein Fehler... Wenn das geshuffelte Array nochmals geshuffelt wird darf es das... Könntest du mir verraten wie das Funktioniert? Geändert von Alphanimal (13-02-2005 um 00:53 Uhr) |
| | |
| | #8 (permalink) |
| helpQLODhelp Registriert seit: Feb 2002 Ort: Köln
Beiträge: 8.505
|
Ah ok, jetzt passt es. Die for-Schleife würde ich aber etwas konventioneller formulieren, for (var i = this.length-1; i>0; i--), das sollte genauso funktionieren. mfg r.
__________________ Ralf Bokelberg™ - Flex & Flash Consulting |
| | |
| | #10 (permalink) |
| God made me funky.. Registriert seit: Apr 2003 Ort: Bremen
Beiträge: 1.067
|
@bokel: Der Fisher-Yates-Shuffle lässt zu das Elemente nicht getauscht werden, da hatte ich nicht dran gedacht. Kommt aus dem Knuth das Teil... @alpha: Einfach das zufällig ausgewählte Element immer an die in der Schleife aktuellen Position schieben und dabei sicherstellen dass das zufällig ausgewählte Element nicht mit dem gerade aktuellen übereinstimmt. Da die Position ja mit jedem Schleifendurchlauf kleiner wird, werden die verschobenen Elemente nicht mehr betrachtet.
__________________ Kunst ist in erster Linie eine Frage der Form und nicht des Inhalts Paul Rand |
| | |
| | #11 (permalink) |
| All-rounder Registriert seit: Mar 2004 Ort: Bayerische Rhön
Beiträge: 2.507
|
Hi. Ich habe auch mal eine Mix-Methode verfasst. ![]() Sieht den anderen etwas ähnlich. ActionScript:
__________________ -------------------------------- Ich klicke, ergo bin ich. (me) -------------------------------- Geändert von thebiz (13-02-2005 um 13:38 Uhr) |
| | |
| | #12 (permalink) |
| notzucht Registriert seit: Nov 2003 Ort: Potsdam
Beiträge: 2.939
|
also das is mal n wirklich "schöner" thread. kommt man sich ja vor, wie bei der Matheolympiade . gut, ich muss an der stelle aber erst noch einmal zur ursprünglichen aufgabe zurück kommen. wie soll es jetzt laufen, soll einfach nur sicher gestellt werden, das kein element nach dem mix-In an alter stelle steht, oder ist hier noch etwas anderes von belang? um zu meiner ersten idee zurück zu kommen, sprich: einfach nur 100%ig sicher stellen das die elemente des arrays in der positionierung, nach dem mix-In, deffinitiv != dem der vorherigen sind, würd ich es so machen.PHP-Code: ... und jetzt ihr wieder
__________________ . Flex in a week | Viertel vor halb nach Vollmond | ^^°.°^^ | Waltz with Bashir . Geändert von shortybmc (13-02-2005 um 14:07 Uhr) |
| | |
| | #13 (permalink) |
| helpQLODhelp Registriert seit: Feb 2002 Ort: Köln
Beiträge: 8.505
|
@thebiz: Ja, aber du stellst nicht sicher, dass kein Element am gleichen Platz bleibt. Dabei fällt mir ein: Sind die Elemente eigentlich alle verschieden? @shortbymc: Stimmt, kein Element bleibt an seinem alen Platz, aber besonders gemischt sind sie auch nicht gerade, oder Wobei das als ein Fall durchaus passieren kann. mfg. r.
__________________ Ralf Bokelberg™ - Flex & Flash Consulting |
| | |
| | #14 (permalink) |
| All-rounder Registriert seit: Mar 2004 Ort: Bayerische Rhön
Beiträge: 2.507
|
Wenn man Karten mischt, dann ist auch die Wahrscheinlichkeit gegeben, dass alle wieder an der gleichen Stelle sind.
__________________ -------------------------------- Ich klicke, ergo bin ich. (me) -------------------------------- |
| | |
| | #15 (permalink) |
| copy Registriert seit: Jul 2004 Ort: Hamburch
Beiträge: 301
|
wow, hier hab ich ja 'was losgetreten! Vielen Dank auf jeden Fall für die vielen hilfreichen Antworten und Ideen. @e2e4: Auch wenn ich Deinen Code erstmal überhauptnet verstanden hab, nachdem ich Deine Erklärung gefunden hab, war einiges klarer:-) Vielen Dank! Wenn nicht noch ne andere ganz tolle Idee auftaucht, dann hast Du wohl die "Matheolympiade" (zumindest aus meine Sicht) gewonnen:-) @thebiz: Sehe ich das falsch und irre mich: Deine Mixfunktion mixt aber nur - sie schließt nicht aus, dass ein Element zufällig wieder auf der alten Position im Array landet - oder? Ja, bei Mischen eines Kartenspieles kann das vorkommen - diesen Spezialfall und den Fall, dass eine oder mehrere "Karten" an gleicher Stelle liegen wie vorher wollte ich ja aber gerade ausschließen:-) @Bokel ("Sind die Elemente eigentlich alle verschieden?"): Ja, zum Glück! Sonst kann man ja wahnsinnig werden - insbesondere dann, wenn mehr als die Hälfte aller Elemente gleich ist *ggg*:-) @shortybmc (ich geh mal schweer davon aus, daß diese Möglichkeit mit Sicherheit die ist, an die jeder zuerst gedacht hat): Naja, ich hatte GANZ KURZ an sowas änliches gedacht: Erst mixen (änlich wie thebiz, und dann alles um eine Position verschieben - macht aber natürlich auch nicht wirklich Sinn - ich darf garnich daran denken, dass ich sowas Blödsinniges gedacht habe; Son Stuss:-) Nochmal an Alle: Vielen, vielen Dank! P.S.: Sorry, dass ich mich erst so spät wieder melde - heute nacht war das Forum aber plötzlich nichmehr zu erreichen:-( Geändert von soundZ (14-02-2005 um 13:32 Uhr) |
| | |
![]() |
| Lesezeichen |
| Themen-Optionen | |
| Ansicht | |
| |