Zurück   Flashforum > Flash > ActionScript > ActionScript 1

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 10-03-2004, 14:13   #1 (permalink)
Glücklicher User
 
Registriert seit: Oct 2003
Ort: Friedrichshafen (Bodensee)
Beiträge: 53
random gibt doppelte zahlen aus

Ich brauche 178 zufallszahlen, die nicht doppelt auftreten dürfen.


zufallszahl_a = random(178); //erstellung der zufallszahlen

//--------------------------------------------------------------------------


suche_a = zufallszahl_a;
belegt_a = -2;

for (i=0;i>178;i++) {
if(arr_zahlen_a[i] == suche_a)
belegt_a=i;
} // überprüft ob die zahl schon in dem array vorhanden ist

//----------------------------------------------------------------------------

}else{
if(belegt_a == -2){
pushed_a = arr_zahlen_a.push(suche_a);
_root["start_ani_a_"+suche_a].gotoAndPlay(2);
gotoAndPlay(3);
}else{
gotoAndPlay(3);
}
}
// wenn die zahl nicht vorhandenist, sollsie in das array angehängt werden, damit es beim nächten durchlauf erkannt wird.

das Problem ist, dass dennoch einige zahlen doppelt genommen werden. hat mir da jemand eine idee?
ALL4PAGES ist offline   Mit Zitat antworten
Alt 10-03-2004, 17:17   #2 (permalink)
Ketchuper
 
Registriert seit: Jun 2002
Beiträge: 129
for (i=0;i>178;i++) {
if(arr_zahlen_a[i] == suche_a)
belegt_a=i;
} // überprüft ob die zahl schon in dem array vorhanden ist

also diese schleife wird nicht ausgeführt, weil deine bedingung i>178 nicht eintritt. du startest ja mit i=0 und willst noch oben zählen, oder?! du musst i<178 reinsetzen.

außerdem generierst du mit random(178) keine 178 zufallszahlen, sondern eine zufallszahl zwischen 0 und 178 (oder 177?).

greets
__________________
----------
Mannoman
Sonk ist offline   Mit Zitat antworten
Alt 10-03-2004, 17:38   #3 (permalink)
r0b
Neuer User
 
Benutzerbild von r0b
 
Registriert seit: Feb 2002
Ort: Hamburg
Beiträge: 1.281
Dieser Ansatz ist, was die Performance angeht sehr schlecht. Je weiter du ans Ende des Array's kommst, desdo mehr Fehlversuche hast du bei dem der Zufallswert schon vorhanden ist und du trotzdem das ganze Array durchsuchst.

Besser wäre im ersten Schritt ein Array mit allen Zahlen von 1 bis 178 zu füllen und dann nurnoch X mal die Positionen zu vertauschen. Das sind zwei Vorgänge mit vorhersehbaren Laufzeiten. Ich glaube hier war auch schonmal was passendes zum Thema Array.shuffle, wenn ich mich da nicht täusche.

mfg

Robert
__________________
robertreich.de v4 | Pixelfonts & FlashSite Tutorial
Friends of ED - Byte Size Flash MX: Adventures in Optimization

"Give a man a fish, and he eats for a day... Show him how to fish, and he eats for a lifetime."
r0b ist offline   Mit Zitat antworten
Alt 10-03-2004, 22:11   #4 (permalink)
Glücklicher User
 
Registriert seit: Oct 2003
Ort: Friedrichshafen (Bodensee)
Beiträge: 53
Danke ihr konntet mir bei meinem probem helfen
ALL4PAGES ist offline   Mit Zitat antworten
Alt 10-03-2004, 23:37   #5 (permalink)
Techniker
 
Benutzerbild von hgseib
 
Registriert seit: Sep 2003
Ort: 64807
Beiträge: 16.324
http://www.SeibsProgrammLaden.de/fra...gm/Algorithmen

um doppelte zu vermeiden wäre eine kleine anpassung sinnvoll z.B.:

vArray[v]=vArray[v-1]+random()+.01;
__________________
die ultimative antwort auf alle programmierfragen: der debugger
mfg h.g.seib www.SeibsProgrammLaden.de
hgseib ist offline   Mit Zitat antworten
Alt 11-03-2004, 11:59   #6 (permalink)
Glücklicher User
 
Registriert seit: Oct 2003
Ort: Friedrichshafen (Bodensee)
Beiträge: 53
wenn es jemand wissen will hier meine vorgehensweise, nach dem ich einer eurer vorschläge gelesen habe.

-----------(Schlüsselbild 1)----------
myArray_b=[0]

Array.prototype.shuffle = function(Zufall){//Zufall = Anzahl Verschiebungen
for(i=0;i<Zufall;i++){//So oft wie durch Zufall vorgegeben
number=random(this.length);//Such Dir eine Nummer aus
element=this[number];//Merk Dir den Inhalt des Elementes mit dieser Nummer
this.splice(number,1);//Lösch das Element aus dem Array
this.splice(random(this.length),0,element);//Füge den Inhalt an zufälliger Stelle wieder ein
}
}

for(i=1;i<178;i++){
pushed_a = myArray_b.push(i);
}//füllt das Array mit den Zahlen von 1-178

myArray_b.shuffle(178);//Verschiebe zufällig 178 Elemente

--------------(Schlüsselbild 3)---------------------

if(myArray_b.length>0){
popped_b = myArray_b.shift();//gibt erste zahl des Array in Variable und löscht diese im Array
_root["start_ani_a_"+popped_b].gotoAndPlay(2);
gotoAndPlay(2);
}else{
stop();
}


*********************************************
* *
* zum betrachten für flashplayer7 als demo unter *
* *
* http://jenniferlovehewitt.all4pages.de *
* *
*********************************************
ALL4PAGES ist offline   Mit Zitat antworten
Alt 11-03-2004, 16:34   #7 (permalink)
r0b
Neuer User
 
Benutzerbild von r0b
 
Registriert seit: Feb 2002
Ort: Hamburg
Beiträge: 1.281
Sieht gut aus. Als Tipp zum posten hier: Klammer beim nächsten mal den AS-code ein. <as></as> in eckigen Klammern. Dann kann man den Code besser lesen, da er dann formatiert und gehighlightet wird.

mfg

Robert
__________________
robertreich.de v4 | Pixelfonts & FlashSite Tutorial
Friends of ED - Byte Size Flash MX: Adventures in Optimization

"Give a man a fish, and he eats for a day... Show him how to fish, and he eats for a lifetime."
r0b ist offline   Mit Zitat antworten
Alt 12-03-2004, 10:24   #8 (permalink)
Glücklicher User
 
Registriert seit: Oct 2003
Ort: Friedrichshafen (Bodensee)
Beiträge: 53
o.k. nicht als strafe nur zur übung, hier nochmal der code in schöner form.

-----------(Schlüsselbild 1)----------
<as>
myArray_b=[0]

Array.prototype.shuffle = function(Zufall){//Zufall = Anzahl Verschiebungen
for(i=0;i<Zufall;i++){//So oft wie durch Zufall vorgegeben
number=random(this.length);//Such Dir eine Nummer aus
element=this[number];//Merk Dir den Inhalt des Elementes mit dieser Nummer
this.splice(number,1);//Lösch das Element aus dem Array
this.splice(random(this.length),0,element);//Füge den Inhalt an zufälliger Stelle wieder ein
}
}

for(i=1;i<178;i++){
pushed_a = myArray_b.push(i);
}//füllt das Array mit den Zahlen von 1-178

myArray_b.shuffle(178);//Verschiebe zufällig 178 Elemente
</as>
--------------(Schlüsselbild 3)---------------------
<as>
if(myArray_b.length>0){
popped_b = myArray_b.shift();//gibt erste zahl des Array in Variable und löscht diese im Array
_root["start_ani_a_"+popped_b].gotoAndPlay(2);
gotoAndPlay(2);
}else{
stop();
}
</as>

*********************************************

zum betrachten für flashplayer7 als demo unter

http://jenniferlovehewitt.all4pages.de

*********************************************
ALL4PAGES ist offline   Mit Zitat antworten
Alt 12-03-2004, 10:28   #9 (permalink)
r0b
Neuer User
 
Benutzerbild von r0b
 
Registriert seit: Feb 2002
Ort: Hamburg
Beiträge: 1.281
Zitat:
Geschrieben von r0b
<as></as> in eckigen Klammern.


Siehe auch die Schaltflächen oben über der Textbox beim posten. # , PHP , AS , List , Quote und so weiter...
__________________
robertreich.de v4 | Pixelfonts & FlashSite Tutorial
Friends of ED - Byte Size Flash MX: Adventures in Optimization

"Give a man a fish, and he eats for a day... Show him how to fish, and he eats for a lifetime."
r0b ist offline   Mit Zitat antworten
Alt 12-03-2004, 10:29   #10 (permalink)
Flashworker
 
Benutzerbild von sebastian
 
Registriert seit: Nov 2001
Ort: Wiesbaden
Beiträge: 10.945
kleine anmerkung: zufallszahlen heißt, dass es auch zufall ist und das sie deswegen auch doppelt vorkommen mit großer wahrscheinlichkeit. du möchtest die zahlen in zufälliger reihenfolge ausgeben

und das nächste mal bitte die AS-Tags mit den richtigen Klammern verwenden, ist um einiges komfortabler zu lesen
edit: zu langsam
sebastian ist offline   Mit Zitat antworten
Alt 12-03-2004, 10:30   #11 (permalink)
Glücklicher User
 
Registriert seit: Oct 2003
Ort: Friedrichshafen (Bodensee)
Beiträge: 53
o.k. nicht als strafe nur zur übung, hier nochmal der code in schöner form.

ActionScript:
  1. //-----------(Schlüsselbild 1)----------
  2.  
  3. myArray_b=[0]
  4.  
  5. Array.prototype.shuffle = function(Zufall){//Zufall = Anzahl Verschiebungen
  6. for(i=0;i<Zufall;i++){//So oft wie durch Zufall vorgegeben
  7. number=random(this.length);//Such Dir eine Nummer aus
  8. element=this[number];//Merk Dir den Inhalt des Elementes mit dieser Nummer
  9. this.splice(number,1);//Lösch das Element aus dem Array
  10. this.splice(random(this.length),0,element);//Füge den Inhalt an zufälliger Stelle wieder ein
  11. }
  12. }
  13.  
  14. for(i=1;i<178;i++){
  15. pushed_a = myArray_b.push(i);
  16. }//füllt das Array mit den Zahlen von 1-178
  17.  
  18. myArray_b.shuffle(178);//Verschiebe zufällig 178 Elemente
  19.  
  20. //--------------(Schlüsselbild 3)---------------------
  21.  
  22. if(myArray_b.length>0){
  23. popped_b = myArray_b.shift();//gibt erste zahl des Array in Variable und löscht diese im Array
  24. _root["start_ani_a_"+popped_b].gotoAndPlay(2);
  25. gotoAndPlay(2);
  26. }else{
  27. stop();
  28. }
*********************************************

zum betrachten für flashplayer7 als demo unter

http://jenniferlovehewitt.all4pages.de

*********************************************
ALL4PAGES ist offline   Mit Zitat antworten
Alt 12-03-2004, 10:30   #12 (permalink)
r0b
Neuer User
 
Benutzerbild von r0b
 
Registriert seit: Feb 2002
Ort: Hamburg
Beiträge: 1.281
jupp.
Edit: Ahhh... Na siehste... So sieht das doch gleich viel schicker aus.
Edit2: wenn du jetzt noch den "ändern" Button gefunden hast (für's nächste mal) dann kannste die oberen Beispiele auch nochmal schick machen.
__________________
robertreich.de v4 | Pixelfonts & FlashSite Tutorial
Friends of ED - Byte Size Flash MX: Adventures in Optimization

"Give a man a fish, and he eats for a day... Show him how to fish, and he eats for a lifetime."

Geändert von r0b (12-03-2004 um 10:32 Uhr)
r0b ist offline   Mit Zitat antworten
Alt 12-03-2004, 10:34   #13 (permalink)
Glücklicher User
 
Registriert seit: Oct 2003
Ort: Friedrichshafen (Bodensee)
Beiträge: 53
Ja, das Forum hier ist wirklich schön gemacht und sehr hilfreich!
ALL4PAGES ist offline   Mit Zitat antworten
Alt 13-03-2004, 09:04   #14 (permalink)
Neuer User
 
Registriert seit: Jan 2002
Beiträge: 1.244
hi,

hier noch etwas zum Thema "doppelte Zufallszahlen vermeiden"

(Stammt glaube ich auch aus diesem Forum)

Hier kann man auch angeben, wieviel Zahlen man aus einem Bereich
haben möchte.



ActionScript:
  1. /*********************** doppelte Zufallszahl vermeiden ***********************/
  2. MovieClip.prototype.zufall = function (resource, quantity) {
  3.     for (i = 0; i <= resource; i++) {
  4.         sources.push (i);
  5.     }
  6.     for (a = 1; a <= quantity; a++) {
  7.         chose = random ((resource + 2) - a);
  8.         this["z" + a] = sources[chose];
  9.         sources.splice (chose, 1);
  10.         _root["z" + a] = this["z" + a];
  11.     }
  12. };
  13. zufall (178, 178);
  14. for (i = 1; i <= 178; i++) {
  15.     trace (eval ("z" + i));
  16. }
__________________
Mfg aus Brandenburg.

harego

Spiel

Zur Page
harego 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 05:57 Uhr.

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


Copyright ©1999 – 2012 Marc Thiele