Zurück   Flashforum > Flash > ActionScript > ActionScript 1

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 12-02-2005, 22:45   #1 (permalink)
copy
 
Registriert seit: Jul 2004
Ort: Hamburch
Beiträge: 301
Question Array mischen - aber gründlich!

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.
soundZ ist offline   Mit Zitat antworten
Alt 12-02-2005, 23:37   #2 (permalink)
helpQLODhelp
 
Benutzerbild von bokel
 
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.

Geändert von bokel (12-02-2005 um 23:48 Uhr)
bokel ist offline   Mit Zitat antworten
Alt 12-02-2005, 23:55   #3 (permalink)
God made me funky..
 
Registriert seit: Apr 2003
Ort: Bremen
Beiträge: 1.067
Keine falschen Lorbeeren für mich
ActionScript:
  1. /**
  2. * Shuffles an array using the Fisher-Yates shuffle.
  3. */
  4. Array.prototype.shuffle = function() {
  5.     for (var i = this.length; --i; i>0) {
  6.         var j = random( i  + 1 );
  7.         var temp = this[ i ];
  8.         this[ i ] = this[ j ];
  9.         this[ j ] = temp;
  10.     }
  11. }
  12. var toMix = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
  13. toMix.shuffle();
  14. trace(toMix)
__________________
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)
e2e4 ist offline   Mit Zitat antworten
Alt 13-02-2005, 00:07   #4 (permalink)
helpQLODhelp
 
Benutzerbild von bokel
 
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.

Geändert von bokel (13-02-2005 um 00:24 Uhr)
bokel ist offline   Mit Zitat antworten
Alt 13-02-2005, 00:09   #5 (permalink)
Freizeitflasher
 
Benutzerbild von Alphanimal
 
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:
= ["a","b","c","d"]; //Ein-Array
ta = []; //Aus-Array
for(i=0;i<a.length;i++){
if(
a[i]==undefined){ //Keine "undefined" erlaubt!
a.length//Schleife abbrechen
}else if(i==a.length-&& ta[i]==undefined){ //Letztes Element passt nicht! *
ta = []; //Neu anfangen: Aus-Array leeren, Zähler zurücksetzten
= -1// (-1 damit er am Schleifenanfang wieder auf 0 steht)
}else{ // Nix passiert, hier kommt das eigentliche Skript
do{
ti random(a.length); //Zufälligen Ziel-Index erstellen
}while(ti==|| ta[ti]!=undefined); //wenn es die gleiche Position ist, oder das Feld nicht frei ist... neu erstellen
ta[ti] = a[i]; //Kopieren!
}
}
trace("result: "+ta); 
* Die ausnahme tritt dann auf, wenn alle Elemente gesetzt wurden, ausser das letzte, dieses sich aber an der gleichen Stelle wie das Ausgangs-Element befindet.
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:
function shuffle_all(a){
var 
ta = [], i;
for(var 
i=0;i<a.length;i++){
if(
a[i]==undefined){
return 
undefined;
}else if(
i==a.length-&& ta[i]==undefined){ //Letztes Element passt nicht!
ta = [];
= -1;
}else{
do{
    
ti random(a.length);
}while(
ti==|| ta[ti]!=undefined);
ta[ti] = a[i];
}
}
return 
ta;

Edit:
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!
Alphanimal ist offline   Mit Zitat antworten
Alt 13-02-2005, 00:40   #6 (permalink)
God made me funky..
 
Registriert seit: Apr 2003
Ort: Bremen
Beiträge: 1.067
@bokel:

*hmpfr* muß ich ja nochmal ran

ActionScript:
  1. Array.prototype.shuffle = function() {
  2.     for (var i = this.length; --i; i>0) {
  3.         var j = random(i+1);
  4.         if (i == j) {
  5.             ++i;
  6.             continue;
  7.         }
  8.         var temp = this[i];
  9.         this[i] = this[j];
  10.         this[j] = temp;
  11.     }
  12. };
  13. var toMix = [0, 1, 2, 3];
  14. for (var i = 0; i<10; i++) {
  15.     toMix.shuffle();
  16.     trace(toMix);
  17. }
__________________
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)
e2e4 ist offline   Mit Zitat antworten
Alt 13-02-2005, 00:44   #7 (permalink)
Freizeitflasher
 
Benutzerbild von Alphanimal
 
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)
Alphanimal ist offline   Mit Zitat antworten
Alt 13-02-2005, 01:05   #8 (permalink)
helpQLODhelp
 
Benutzerbild von bokel
 
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.
bokel ist offline   Mit Zitat antworten
Alt 13-02-2005, 01:11   #9 (permalink)
Freizeitflasher
 
Benutzerbild von Alphanimal
 
Registriert seit: Jun 2004
Ort: Niederösterreich
Beiträge: 615
Was für eine Überlegung steckt da dahinter? Ich versteh den Code nicht...
Alphanimal ist offline   Mit Zitat antworten
Alt 13-02-2005, 10:00   #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
e2e4 ist offline   Mit Zitat antworten
Alt 13-02-2005, 13:37   #11 (permalink)
All-rounder
 
Benutzerbild von thebiz
 
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:
  1. a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
  2. b = ["anna", "ben", "chris", "dirk", "fred", "glen", "hans"];
  3. //-----------------------------------------------------------------
  4. Array.prototype.mix = function() {
  5.     for (var i = 0; i < this.length; i++) {
  6.         var alt = Math.round(Math.random() * (this.length - 1));
  7.         var neu = Math.round(Math.random() * (this.length - 1));
  8.         var wert = this[alt];
  9.         this.splice(alt, 1);
  10.         this.splice(neu, 0, wert);
  11.     }
  12.     trace(this);
  13. };
  14. //-----------------------------------------------------------------
  15. a.mix();
  16. b.mix();
__________________

--------------------------------
Ich klicke, ergo bin ich. (me)
--------------------------------

Geändert von thebiz (13-02-2005 um 13:38 Uhr)
thebiz ist offline   Mit Zitat antworten
Alt 13-02-2005, 13:57   #12 (permalink)
notzucht
 
Benutzerbild von shorty
 
Registriert seit: Nov 2003
Ort: Potsdam
Beiträge: 2.939
Question ...

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:
var arrOrig:Array = new Array('0''1''2''3''4''5');
// ----------------------------------------------------------
function fncReplace(arrToMix:Array) {
    
arrToMix.push(arrToMix[0]);
    
arrToMix.shift(arrToMix[0]);
    
trace(arrOrig);
}
// ----------------------------------------------------------
fncReplace(arrOrig); 
* ich geh mal schweer davon aus, daß diese möglichkeit mit sicherheit die ist, an die jeder zuerst gedacht hat, aber hier werden doch deffinitiv alle elemente an eine andere position gesetzt, oder seh ich da was falsh? ausnahmen gibts natürlich auch hier, ist wie beim karten spielen, wenn ich nur eine karte habe, kann ich die ja logischerweise mit keiner anderen mischen, und darum müßen halt mind.2 elemente im array vorhanden sein.

... 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)
shorty ist offline   Mit Zitat antworten
Alt 13-02-2005, 16:44   #13 (permalink)
helpQLODhelp
 
Benutzerbild von bokel
 
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.
bokel ist offline   Mit Zitat antworten
Alt 13-02-2005, 17:00   #14 (permalink)
All-rounder
 
Benutzerbild von thebiz
 
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)
--------------------------------
thebiz ist offline   Mit Zitat antworten
Alt 13-02-2005, 17:45   #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)
soundZ ist offline   Mit Zitat antworten
Antwort

Lesezeichen

Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind an
Pingbacks sind an
Refbacks sind an



Alle Zeitangaben in WEZ +1. Es ist jetzt 11:06 Uhr.

Domains, Webhosting & Vserver von Host Europe
Unterstützt das Flashforum!
Adobe User Group


Copyright ©1999 – 2012 Marc Thiele