PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Zufällige Variablen zuordnen



MarleyJam
14.09.2008, 20:43
Hei Leute,
ich hab ein kleines Problem mit der Funktion der Zufallsvariablen.
Ich habe 5 Variablen und möchte jeder eine Zahl zwischen 1 und 5 zuordnen, was zunächst noch kein Problem darstellt, da es leicht mit Change Variable Random 1*5 zu bewerkstelligen wäre.
Das eigentliche Problem ist, dass wenn z.b. für Variable 1 der Wert 3 eingespeist wird, dieser Wert nicht mehr für die anderen Variablen verwendet werden soll. Das Ergebnis soll so aussehen, das jede der 5 Variablen einen eigenen Wert erhält und kein Wert doppelt vorkommt.
Kann mir vielleicht jemand helfen?

Nesis
14.09.2008, 20:56
Lass es 5 mal (Für jede Var. 1 mal) Durchlaufen und frage ab der 2. ab ob diese schon verwendet wird.

Wenn Ja soll es nochmal durchlaufen werden... obwohl... dann könnte es immer noch die selbe sein... gibt es einen Befehl das etwas so lange durchlaufen wird bis ein bestimmter Wert erreicht ist?

Kelven
14.09.2008, 21:02
Ich hab das mal in Pseudo-Code geschrieben. Hoffe du verstehst was ich meine. Die Zielvariablen heißen Ziel1-5.


VAR Counter = 1
Loop
Forc VAR Counter > 5
break loop
end
VAR Position = Random 1*5
VAR Position = VAR Position + (ID von VAR Ziel1 - 1)
VAR Tmp = [VAR Position] \\ das ist die 3. Option unten bei Chance Variable
Forc VAR Tmp == 0
[VAR Position] = VAR counter \\ Die 3. Option oben
VAR counter = VAR counter + 1
end
end

MarleyJam
16.09.2008, 11:52
Also ich habs mal versucht in den Maker zu schreiben, bei mir sieht's so aus:

<>Variable Oper: [0001:Counter] Set, 1
<>Loop
<>Branch if Var [0001:Counter] is 5 Greater
<>Break Loop
<>
: End
<>Variable Oper: [0002:Position] Set, Rnd [1-5]
<>Variable Oper: [0002:Position] +, Var [0004]'s Value
<>Variable Oper: [0003:Tmp] Set, Var [V[0002]] Value
Branch if Var [0003:Tmp] is 0
<>Variable Oper: [V[0002]] Set, Var [0001]'s Value
<>Variable Oper: [0001:Counter] + , 1
<>
: End
<>
: End Loop
<>

Wobei die Variablen folgendermaßen aussehen:
0001:Counter
0002:Position
0003:Tmp
0004:Ziel01
0005:Ziel02
0006:Ziel03
0007:Ziel04
0008:Ziel05



Ich bin mir nicht genau sicher, wo ich einen Fehler eingebaut hab, vllt sieht ihn jemand und kann mir helfen.

Kelven
16.09.2008, 15:53
Diese Zeile ...

Variable Oper: [0002:Position] +, Var [0004]'s Value
müsste in deinem Fall so lauten ...

Variable Oper: [0002:Position] + 3

Durch sie wird nämlich die Position der Zielvariable bestimmt. Bei dir haben die Variablen die IDs 4-8, also muss auf den Zufallswert noch eine 3 draufaddiert werden.

CapSeb
16.09.2008, 18:58
Und ich hab es mal gemalt.

http://npshare.de/files/38/1603/einsbisfuenf.PNG

Die obere Hälfte des Bildes ist der von Kelven und MarleyJam gepostete Code. Es gibt die fünf festgelegten Zahlen, die nacheinander verwendet werden (Loop von 1 bis 5). Zwei gleiche Zahlen kann es also nicht geben.

Die Zufallsfunktion (Random 1 bis 5) gibt hierbei die Variablenposition an.
Problem: Man darf keine Position zweimal verwenden.
Lösung: Gucken, ob die Position schon beschrieben wurde (nicht null) und immer wieder eine neue Position ausprobieren.
Verbrauchtes "Material": 8 Variablen


Die untere Hälfte des Bildes ist eine alternativ Methode. Es gibt die fünf festgelegten Variablenpositionen, die nacheinander verwendet werden (Loop von 1 bis 5). Es wird also im Gegensatz zu oben nie versucht, zweimal die geiche Position zu füllen.

Die Zufallsfunktion (Random 1 bis 5) gibt hierbei die Zahl an, die reingeschrieben wird.
Problem: Man darf keine Zahl zweimal verwenden.
Lösung: Gucken, ob die Zahl schon verwendet wurde (bei anderen Positionen oder Switchs verwenden).
Verbrauchtes "Material": 7 Variablen, 6 Switchs


Und der Code dazu:


Counter = Nummer der ersten Variable (zB. 4);
Loop
SwitchGo = off;
Zahl = Random (1 bis 5);
if (Zahl == 1) und (Switch1 == OFF) --> (Switch1 = ON; SwitchGo = ON;)
if (Zahl == 2) und (Switch2 == OFF) --> (Switch2 = ON; SwitchGo = ON;)
if (Zahl == 3) und (Switch3 == OFF) --> (Switch3 = ON; SwitchGo = ON;)
if (Zahl == 4) und (Switch4 == OFF) --> (Switch4 = ON; SwitchGo = ON;)
if (Zahl == 5) und (Switch5 == OFF) --> (Switch5 = ON; SwitchGo = ON;)
if (SwitchGo == ON) --> (*No[Counter] = Zahl; Counter +1;)
if (Counter == zu groß, zB. 9) --> (Break, also Loop verlassen)
Ende des Loops;
* die dritte Funktion oben bei Change Variable, wie schon von Kelven angesprochen


http://www.multimediaxis.de/images/smilies/old/s_017.gif CapSeb http://www.multimediaxis.de/images/smilies/old/s_065.gif

MarleyJam
17.09.2008, 11:55
Endlich hab ichs verstanden....:D

Vielen Dank Jungs!!http://www.multimediaxis.de/images/smilies/old/sm_12.gif
Werd die kürzere Variante von Kelven nehmen, aber die Darstellung von CapSeb hat mir Verständnis verschafft!
Danke nochmal!

Nesis
18.09.2008, 16:53
Wenn mir jetzt noch bitte einer die richtige benutzung der Loops erklären könnte bitteschöön http://www.multimediaxis.de/images/smilies/old/2/smiliez.de_2124.gif

MarleyJam
19.09.2008, 11:58
Ein Loop ist dazu da, eine bestimmte Aktion solange zu durchlaufen, bis sie den gewünschten Effekt erzielt hat.
Du beginnst das Event mit einem Loop inden du das hineinschreibst, was du solange wiederholen möchtest bis es eine bestimmte Bedingung erfüllt.
Beispiel:
Du möchtest, das eine Variable solange um 1 erweitert wird, bis der Wert 5 überschritten wird. Das sieht dann im Maker so aus:



<>Variable Oper: [0001:Zähler] Set, 1 |Hier wird die Variable auf 1 gesetzt
<>Loop |Hier wird der Loop eingefügt
<>Branch if Var [0001:Zähler] is 5 Greater |Hier wird abgefragt ob die Variable größer ist als 5
<>Break Loop |Ist dies der Fall, wird der Loop verlassen
<>
: End
<>Variable Oper: [0001:Zähler] + , 1 |Ist dies NICHT der Fall, wird zum derzeitigen Wert 1 dazu addiert
<>
: End Loop
<>


Somit wird der Loop solange durchlaufen, bis schlussendlich der Wert 5 erreicht bzw. überschritten ist.

makenshi
19.09.2008, 12:15
Als Alternative Form der Schleife gibt es auch die Möglichkeit
immer wieder zu einer Sprungmarke, einem Label zu springen.
So lassen sich auch bestimmte Codeabschnitte wiederholen.
Ich bevorzuge diese, da sie in meinen Augen besser kontrollierbar
ist.

Der Label Befehl ist auf Seite 3 der Eventbefehle, rechte Spalte, 6ter befehl von oben. Damit kann man eine Sprungmarke setzen. Der Befehl um zu so einer Marke zu springen, befindet sich direkt unter dem Befehl zum setzen.

Cherry
19.09.2008, 14:30
Als Alternative Form der Schleife gibt es auch die Möglichkeit
immer wieder zu einer Sprungmarke, einem Label zu springen.
So lassen sich auch bestimmte Codeabschnitte wiederholen.
Ich bevorzuge diese, da sie in meinen Augen besser kontrollierbar
ist.

Der Label Befehl ist auf Seite 3 der Eventbefehle, rechte Spalte, 6ter befehl von oben. Damit kann man eine Sprungmarke setzen. Der Befehl um zu so einer Marke zu springen, befindet sich direkt unter dem Befehl zum setzen.

Das ist Ansichtssache; Loops/Cycles sind imo leichter zu verstehen und zu kontrollieren und auch optisch sichtbar. Mag sein, dass das daher kommt, dass ich GOTO-Hasser bin und dieses Schlüsselwort in meinen Programmen niemals verwenden würde. Das einzige, was an Loops wirklich ein Nachteil ist, ist der, dass bei Verschachtelungen ein Problem mit Break Loop auftritt (Bug).

Nesis
19.09.2008, 17:58
Hurra Danke =D

Somit kann man ja Dinge die Zeitlich zufällig hintereinander eintreten sollen (Wie Donner + Blitz) ja viel einfacher gestalten... ich hab immer 3 Eventseiten gemacht xD...