Zurück   Flashforum > Flash > Stuff

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 08-11-2007, 14:08   #1 (permalink)
It's all a Game
 
Benutzerbild von Kandidat
 
Registriert seit: Sep 2004
Ort: Berlin
Beiträge: 53
Lightbulb [STUFF] Lucky Number Random Script

Hallo liebe Flasher,

ich habe ein Randomscript entwickelt, das innerhalb eines bestimmten Maximums bereits "gewürfelte" Nummern notiert und eine Wiederwahl ausschließt bis nicht alle möglichen Nummern einmal gewürfelt worden.

Verstanden?


Funktion:
Also zuerst wird ein Maxmimum festgelegt (z.B. Maximum = 5) dann wird zum ersten Mal "gewürfelt" (d.h. Math.random(max) ausgeführt) und das Ergebnis in einem Array (EXCLUDE) festgehalten. Der Array wächst von Wurf zu Wurf und vergleicht jedes Random-Ergebnis so lange bis eine Zahl entspringt, die noch nicht im Array gelistet wurde. Wenn soviel Mal gewürfelt wurde wie es dem Maximum entspricht, wird der Array neugestartet und die Prozedur wiederholt sich von vorne.


Ein gutes Anwende-Beispiel: Alienscript

Das kleine Alien auf der rechten Seite spielt zufällig ausgewählte MP3-Streams ab. Um lästige Wiederholungen der kurzen Loops zu vermeiden kommt das Lucky-Number-Script zum Einsatz und hält mögliche Wiederholungen so lange zurück bis jeder Loop einmal gespielt wurde!


Anwendung
Script einfach in eine neue Flash-Datei kopieren und ausprobieren

ActionScript:
  1. // [url]www.biffbang.de[/url]
  2. //
  3. // Zu Beginn einen Spielraum festlegen
  4. _global.MAXIMUM = 5;
  5. // Click-Counter
  6. _global.click = 0;
  7. // Array zum Ausschließen der Nummern
  8. EXCLUDE = [];
  9. //
  10. // LUCKY NUMBER Funktion
  11. LuckyNumber = function () {
  12.     // RANDOM
  13.     this.mixXit = function() {
  14.         this.LN = Math.round(random(MAXIMUM));
  15.         EXCLUDE[click] = this.LN;
  16.         trace(this.LN);
  17.         this.compare();
  18.     };
  19.     // VERGLEICH
  20.     this.compare = function() {
  21.         for (var i = 0; i<EXCLUDE.length-1; i++) {
  22.             if (this.LN == EXCLUDE[i]) {
  23.                 this.mixXit();
  24.             }
  25.         }
  26.     };
  27.     // RESET Click-Counter && Array
  28.     if (click>=MAXIMUM) {
  29.         EXCLUDE.splice(0, EXCLUDE.length, this.LuckyNumber);
  30.         click = 1;
  31.         trace("-R-E-S-E-T----------");
  32.         trace("");
  33.     }
  34.     // TRIGGER
  35.     this.mixXit();
  36.     this.LuckyNumber = this.LN;
  37.     click++;
  38.     //
  39.     // trace
  40.     trace("Listed: "+EXCLUDE.join(", "));
  41.     trace("Lucky Random Number: "+this.LuckyNumber);
  42.     trace("");
  43. };
  44. _root.onMouseDown = LuckyNumber;
__________________
//Iss nich immer so viel sinnlosen Zucker!
//Iss mal ne Banane zur Abwechslung!

viel.Vitamine = Gesund (Duuuuuuu! Ganove ;-)


Links:
Mein Kofferradio. Mit lauter Smith-Songs
Mein MySpace Account
Kandidat ist offline   Mit Zitat antworten
Alt 25-11-2007, 11:34   #2 (permalink)
hilft gerne...
 
Registriert seit: Feb 2007
Ort: Carlsberg
Beiträge: 416
Is zwar OT, aber dein Script war genau eine Aufgabe aus meiner letzten Kursarbeit in Informatik
McMannus ist offline   Mit Zitat antworten
Alt 26-11-2007, 13:43   #3 (permalink)
It's all a Game
 
Benutzerbild von Kandidat
 
Registriert seit: Sep 2004
Ort: Berlin
Beiträge: 53
Siehste, und ich hab's mir selbst beigebracht =)
__________________
//Iss nich immer so viel sinnlosen Zucker!
//Iss mal ne Banane zur Abwechslung!

viel.Vitamine = Gesund (Duuuuuuu! Ganove ;-)


Links:
Mein Kofferradio. Mit lauter Smith-Songs
Mein MySpace Account
Kandidat ist offline   Mit Zitat antworten
Alt 15-01-2008, 23:43   #4 (permalink)
-
 
Benutzerbild von pape
 
Registriert seit: Jan 2004
Beiträge: 3.002
hm, der Algorithmus ist aber ziemlich ineffizient, da mixXit ja u.U. unendlich oft aufgerufen wird, falls zufällig immer genau die Zahlen kommen, die schon waren. Außerdem läuft die For-Schleife nach dem (verschränkt-)rekursiven Aufruf noch weiter, was zu nicht gewünschtem Verhalten füren könnte (muss man im Ergebnis nicht sehen, aber intern kann da einiges schief laufen).

Mein Tipp wäre es nach dem folgenden Prinzip vorzugehen:

Maximum setzen, zahlen von 1 bis Maximum in ein Array nochZuZiehen schreiben.
Per Random aus nochZuZiehen.length ein Element des Array auswählen. Dieses aus dem array löschen und in ein Array schonGezogen packen (falls man das wissen will).
Das macht man so lange, wie nochZuZiehen.length > 0 ist. Anschließend füllt man das Array neu (löscht ggf das schonGezogen Array, es seiden man möchte die gesamte Ziehungsreihenfolge dokumentieren) und speichert vorher aber, welche Zahl zuletzt gezogen wurde, um dann den Sonderfall auszuschließen zu können, bei dem z.B. 3 als letztes gezogen wurde und dann nach einem neu Befüllen des Arrays wieder als erstes 3 gezogen wird und somit 2 mal das gleiche Element vorkommt.

Dürfte dann effizienter und leichter zu durchschauen sein. Aber an sich ist ein solcher Stuff-Eintrag sicherlich für den ein oder anderen hilfreich

Ferner könnte man sogar komplett auf MAXIMUM verzichten und einfach nur die Arrays betachten. Was in den Arrays drinsteht ist eigentlich für den Algorithmus egal.

//Edit: Könnte dann z.B. so aussehen (wobei hier jetzt nicht das letzte gezogene gespeichert wird):
ActionScript:
  1. /**
  2. * @author pape
  3. * @version 0.1
  4. */
  5.  
  6. class LuckyNumber {
  7.     var original_pool:Array;
  8.     var pulled:Array;
  9.     var pool:Array
  10.     var trackProcess:Boolean;
  11.     var lastItem:Object;
  12.    
  13.     public function LuckyNumber(pool:Array, trackProcess:Boolean)
  14.     {
  15.         if (0>=pool.length)
  16.         {
  17.             trace("LuckyNumber - Error: empty Array!");
  18.         }
  19.         else
  20.         {
  21.             this.original_pool = pool.slice();
  22.             this.pool = pool.slice();
  23.             this.pulled = new Array();
  24.             this.trackProcess = trackProcess;
  25.         }
  26.     }
  27.     public function getRandomItem()
  28.     {
  29.         if (0>=pool.length)
  30.             reset();
  31.         var item:Object = pool.splice(Math.floor(Math.random()*pool.length) , 1);
  32.         pulled.push(item);
  33.         trace("gezogen: "+pulled);
  34.         trace("verbleibend: "+pool);
  35.         return item;
  36.        
  37.     }
  38.     private function reset():Void
  39.     {
  40.         this.pool = this.original_pool.slice();
  41.         if (!this.trackProcess)
  42.         {
  43.             this.pulled = new Array();
  44.         }
  45.     }
  46. }

Beispiel zum Benutzen der Klasse:
ActionScript:
  1. import LuckyNumber;
  2. a = new Array(1,2,3,4,5);
  3. var l = new LuckyNumber(a, false);
  4. _root.onMouseDown = function () {
  5.     /* Hier nicht vergessen das zurückgegebene Object wieder in seinen eigentlichen Typ zu type-casten.
  6.       (auch wenn es hier in diesem Beispiel erstmal keinen Unterschied macht.. aber wenn man z.B. prüfen
  7.       wollen würde, ob das gezogene Element == 1 ist, dann gäbe es Ärger, da Object immer ungleich Number ist ;)
  8.       In diesem Beispiel hier also nach Number casten.*/
  9.     trace("Diesmal gezogen: "+Number(l.getRandomItem().toString()))+"\n---");
  10. }

Geändert von pape (16-01-2008 um 01:02 Uhr) Grund: Kleinigkeit
pape ist offline   Mit Zitat antworten
Alt 16-01-2008, 14:35   #5 (permalink)
It's all a Game
 
Benutzerbild von Kandidat
 
Registriert seit: Sep 2004
Ort: Berlin
Beiträge: 53
Smile Hi Robert

Danke, dass Du Dich mit dem Script befasst hast. Ich hab' zwar leider zu wenig Erfahrung mit der Art von Action-Script, mit dem Du das geschrieben hast, um weiter mitreden zu können, finde aber Deinen Beitrag echt cool.

Außerdem habe ich momentan wenig Zeit zum Flashen, da ich mich mit dutzenden Farbproofs und Visitenkarten außeinandersetzen muss. (Pain in the Ass ) Man will das perfekte Farbergebnis von mir.

Wobei Leonard Cohen es doch so schön singt: "Forget your perfect offering. There is a crack in everything, that's how the light get's in."

Grüße
Paul
__________________
//Iss nich immer so viel sinnlosen Zucker!
//Iss mal ne Banane zur Abwechslung!

viel.Vitamine = Gesund (Duuuuuuu! Ganove ;-)


Links:
Mein Kofferradio. Mit lauter Smith-Songs
Mein MySpace Account
Kandidat ist offline   Mit Zitat antworten
Alt 24-04-2008, 16:57   #6 (permalink)
It's all a Game
 
Benutzerbild von Kandidat
 
Registriert seit: Sep 2004
Ort: Berlin
Beiträge: 53
Talking

Hallo

ich habe begriffen, was Robert sich ausgedacht hat und habe die Idee auch mal umgesetzt. Einen Array schrumpfen zu lassen ist viel besser als die mögliche Endlosschleife zwischen zwei Funktionen zu provozieren.

Im Code seht ihr ein vereinfachtes Beispiel fürs Ausgabe-Fenster. Die luckyNumber() Funktion operiert hier als einfache return-Methode. Wichtig dabei ist, dass die Initialisierung vor der Anwendung der luckyNumber() Funktion ausgeführt wird, da sonst der Array leer ist.

Danke Robert =)

Code:
function initLuckyNumber() {
	var maximal = 10;
	possible = [];
	for (var i = 0; i<maximal; i++) {
		possible[i] = i;
	}
}
function luckyNumber() {
	var wert;
	var rndm;
	rndm = random(possible.length);
	wert = possible[rndm];
	possible.splice(rndm, 1);
	if (possible.length<=0) {
		initLuckyNumber();
	}
	if (wert == 0) {
		wert = 0;
	}
	return wert;
}
//
initLuckyNumber();
//
// Anwendung
for (var i = 1; i<20; i++) {
	trace(i+". Ergebnis: "+luckyNumber());
}
__________________
//Iss nich immer so viel sinnlosen Zucker!
//Iss mal ne Banane zur Abwechslung!

viel.Vitamine = Gesund (Duuuuuuu! Ganove ;-)


Links:
Mein Kofferradio. Mit lauter Smith-Songs
Mein MySpace Account
Kandidat ist offline   Mit Zitat antworten
Alt 24-04-2008, 17:04   #7 (permalink)
voidboy
 
Benutzerbild von rendner[i]
 
Registriert seit: Sep 2004
Ort: München
Beiträge: 5.588
Was für ein Sinn macht das?
PHP-Code:
if (wert == 0) {
        
wert 0;
    } 
__________________
ERROR: Signature is too large
rendner[i] ist offline   Mit Zitat antworten
Alt 24-04-2008, 22:15   #8 (permalink)
~~~~~~~~~~~~
 
Benutzerbild von _geo_
 
Registriert seit: May 2002
Ort: AUSTRIA (OÖ)
Beiträge: 3.298
Ich denk keinen

mein AS1/2 is schon etwas eingerostet aber ich denk so könnt mans auch machen (über ne Art Array mischen funktion)

PHP-Code:
// LUCKY NUMBER Funktion
LuckyNumber = function(source:Array)
{
    var 
source_index:Number = -1;
    var 
source:Array = source;
    
    
// mix it
    
var shuffle = function()
    {
        
source.sort(function(){return 1-random(3)});
        
source_index source.length 1;
    };
    
    
// get random number
    
this.getNumber = function()
    {        
        if(
source_index 0){
            
shuffle();
        }
        
        
trace(source[source_index--]);
        
//return source[source_index--];
    
}
};

ln = new LuckyNumber( new Array(1,2,3,4,5,6,7,8,9) );
_root.onMouseDown ln.getNumber
lg
__________________
--- :P ---

Blog
Bei unerwünschten Nebenwirkungen zerreißen Sie die Packungsbeilage oder erschlagen ihren Arzt oder Apotheker
_geo_ ist offline   Mit Zitat antworten
Alt 25-04-2008, 00:30   #9 (permalink)
Techniker
 
Benutzerbild von hgseib
 
Registriert seit: Sep 2003
Ort: 64807
Beiträge: 16.326
bis auf eine kleinigkeit perfekt ;-)

deshalb:
http://www.seibsprogrammladen.de/fra...rithmen/Zufall
Zufallsreihenfolgen aneinander reihen

Erzeugt immer wieder eine neue Reihe von Zufallszahlen, wobei die letzte Zahl nicht mit der ersten Zahl der neuen Reihe identisch ist.
__________________
die ultimative antwort auf alle programmierfragen: der debugger
mfg h.g.seib www.SeibsProgrammLaden.de
hgseib ist offline   Mit Zitat antworten
Alt 25-04-2008, 10:53   #10 (permalink)
It's all a Game
 
Benutzerbild von Kandidat
 
Registriert seit: Sep 2004
Ort: Berlin
Beiträge: 53
Talking @render[i]

Ich habe die "if wert == 0" Möglichkeit mit eingebunden, weil es beim üblichen Math.random() keinen Null-wert gibt sondern höchstens "0.0003123". Außerdem kann eine Null bei der Aleatorik zum kompletten Löschen eines Wertes beitragen und in der if Operation kann man verhindern, dass eine Null ausgespuckt wird.

Übrigens kann man an der Stelle "return wert" noch eine /10 einfügen also "return wert/10" so dass es mehr Ähnlichkeit mit Math.random() erhällt.

Gruß Paul
__________________
//Iss nich immer so viel sinnlosen Zucker!
//Iss mal ne Banane zur Abwechslung!

viel.Vitamine = Gesund (Duuuuuuu! Ganove ;-)


Links:
Mein Kofferradio. Mit lauter Smith-Songs
Mein MySpace Account
Kandidat ist offline   Mit Zitat antworten
Alt 25-04-2008, 10:57   #11 (permalink)
voidboy
 
Benutzerbild von rendner[i]
 
Registriert seit: Sep 2004
Ort: München
Beiträge: 5.588
Zitat:
Zitat von Kandidat Beitrag anzeigen
Ich habe die "if wert == 0" Möglichkeit mit eingebunden, weil es beim üblichen Math.random() keinen Null-wert gibt sondern höchstens "0.0003123". Außerdem kann eine Null bei der Aleatorik zum kompletten Löschen eines Wertes beitragen und in der if Operation kann man verhindern, dass eine Null ausgespuckt wird.

Arbeitet dein Compiler anders?
PHP-Code:
trace( (== 0.0003123) ); 
Und Math.random nutzt du gar nicht...
__________________
ERROR: Signature is too large

Geändert von rendner[i] (25-04-2008 um 11:01 Uhr)
rendner[i] ist offline   Mit Zitat antworten
Alt 08-05-2008, 19:01   #12 (permalink)
It's all a Game
 
Benutzerbild von Kandidat
 
Registriert seit: Sep 2004
Ort: Berlin
Beiträge: 53
Thumbs up Refaktoriert

Ich habe das Script nun optimiert und jeglichen Schnick Schnack weggelassen!!

Die Methode ist jetzt einfach anzuwenden ohne vorherige Initiierungs-Funktion. Einzige Veränderung die passiert wenn das Script im Film eingefügt wird sind ein Array (PB) der nach außen geht. (Wenn man mehrere Instanzen des Scriptes benötigt, muss der Array unbedingt umbenannt werden, da es zu Konflikten kommen wird.)

luckyNumber() ist jetzt eine einfache return-Methode.

Ziel ist es nach wie vor Zufallszahlen zu erzeugen, die sich innerhalb eines Maximalwertes nicht wiederholen.

PHP-Code:
function luckyNumber() {
    
//////////////////
    
var MAXIMUM 2;
    
/////////////////
    
function init(startupkickout) {
        for (var 
0i<MAXIMUMi++) {
            
PB[i] = i;
        }
        if (!
startup) {
            
PB.splice(kickout1);
        }
    }
    if (
PB == undefined) {
        
PB = [];
        
init(true);
    }
    var 
rndm;
    var 
wert;
    
rndm random(PB.length);
    
wert PB[rndm];
    
PB.splice(rndm1);
    if (
PB.length == 0) {
        
init(falsewert);
    }
    return 
wert;
}
// Auslöser
for (var 0i<15i++) {
    
trace(luckyNumber());

In dieser Form ähnelt luckyNumber() dem random()

Wenn man return wert/10; schreibt und das MAXIMUM auf 10 Setzt ähnelt es dem Math.random()

Wenn alles klappt poste ich bald eine URL, in der ich das Script ziemlich cool angewandt habe. Dauert aber noch
__________________
//Iss nich immer so viel sinnlosen Zucker!
//Iss mal ne Banane zur Abwechslung!

viel.Vitamine = Gesund (Duuuuuuu! Ganove ;-)


Links:
Mein Kofferradio. Mit lauter Smith-Songs
Mein MySpace Account

Geändert von Kandidat (08-05-2008 um 19:31 Uhr) Grund: Refaktorierung
Kandidat 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 18:32 Uhr.

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


Copyright ©1999 – 2012 Marc Thiele