Jump to content

Zufallsgenerator


Empfohlene Beiträge

vor einer Stunde schrieb Roter Brummer:

ich wusste doch, dass ihr darauf anspringt

Wenn Du dort Hilfe brauchst, wo ich sie geben kann, wirst Du sie immer kriegen!
Und wir haben damit noch einen V5-Fehler gefunden und es ist eine prima Übung.

Gruß
  Andy

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo zusammen,

das Beispiel von @Andy habe ich jetzt in die Anlage eingebaut. Funktioniert anstandslos. Danke.

Das Beispiel von @Goetz gefällt mir insofern, weil es mit viel weniger Elementen auskommt und ein richtig schlankes Script benutzt. Allerdings haben hier die Würfel absolute Koordinaten. Damit kann man das Ganze nicht einfach in der Anlage verschieben, weil die Würfle ja immer wieder an ihre alte Position zurückspringen. Aber mit der Funktion "transformation.position" und kleinen Ebenen, auf die die Würfel zu springen haben, müsste doch noch was gehen, oder? ;)

vor 46 Minuten schrieb Goetz:

Und du kannst mittels Lua sogar überprüfen, ob die Aufgabe gelöst wurde.

Das wäre natürlich in Verbindung mit einem Zeitnehmer (habe ich mir schon gebastelt) und/oder einem Zähler der Rangiervorgänge eine fantastische Abrundung des Ganzen.

Ich bleibe gespannt.

HG

Brummi

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich denke mal, da könnte es in Zukunft durchaus ein paar 'Fahrdienstleiterspiele' geben. Das bringt Leben in die Anlagen und man beschäftigt sich länger damit.
Es ist sehr viel denkbar, aber es sollte schon ein Bezug zur Bahn bleiben, also 'Mastermind' muß jetzt nicht unbedingt sein. Sowas wäre nämlich auch kein Problem.

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 1 Stunde schrieb Roter Brummer:

Allerdings haben hier die Würfel absolute Koordinaten.

Die Koordinaten stehen gut lesbar in diesem Teil des Skripts und können leicht angepasst werden.

1507688549_WuerfelTabelle.thumb.JPG.18fde030561817ca0fd2f6b093cd5d50.JPG

Die Beispielanlage ist eine H0 Anlage. Daher muss man die angezeigten Positionswerte mit 0,87 multiplizieren um die tatsächlichen Positionswerte für die Tabelle zu bekommen.

Alternativ kann man die Liste auch aus der Anfangsposition der Würfel bilden. Also die gegebenen Positionen der Würfel auf der Anlage einmal zu Beginn auslesen und in diese Tabelle übertragen. 

Bearbeitet von Goetz
Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo Goetz,

nachdem ich jetzt alles schön positioniert habe

463.thumb.jpg.d36ea03565ceae73a1dfea54866b3cff.jpg

möchte ich noch eine zweite Rangieraufgabe einbauen. Also habe ich nochmal Quader angelegt, die aber "Quader_B_1" usw. heißen. Ebenso einen zweiten Schalter, der "var2" heißt.

Dann habe ich den Ordner mit deinen Ereignissen dupliziert und alles (auch im Script) sauber umbenannt und andere Koordinaten für die Klötzchen angegeben. Aber jetzt purzelt mir alles durcheinander und die Klötzchen liegen übereinander.

Also die übliche Frage: Was mache ich falsch?

Muss ich die Positionsliste umbenennen?
 

PositionsListe = {
  {x = -15, y = -9.38, z =  -1.4},
  {x = -13.5, y = -9.38, z =  -1.4},
  {x = -12, y = -9.38, z =  -1.4},
  {x = -10.5, y = -9.38, z =  -1.4},
  {x = -9, y = -9.38, z =  -1.4},
  {x = -13.5, y = -9.38, z = -2},
  {x = -12, y = -9.38, z = -2},
  {x = -10.5, y = -9.38, z = -2}
}

function newOrder(Tabelle)
  for i = #Tabelle, 2, -1 do
    table.insert(Tabelle, table.remove(Tabelle, math.random(i)))
  end
  return Tabelle
end
PositionsListe = newOrder(PositionsListe)
$("Quader_B_1").transformation.position = PositionsListe[1]
$("Quader_B_2").transformation.position = PositionsListe[2]
$("Quader_B_3").transformation.position = PositionsListe[3]
$("Quader_B_4").transformation.position = PositionsListe[4]
$("Quader_B_5").transformation.position = PositionsListe[5]
$("Quader_B_6").transformation.position = PositionsListe[6]
$("Quader_B_7").transformation.position = PositionsListe[7]
$("Quader_B_8").transformation.position = PositionsListe[8]

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 6 Stunden schrieb Roter Brummer:

Hat sich erledigt. Ich habs tatsächlich hinbekommen. Und das in meinem Alter!

Heh Brummi

"Alter schuetzt vor dummheit nicht" heist es ja im volksmund abba es schuetzt durchaus davor vorschnell dummheiten zu sagen, einfach weil durch viel lebenserfahrung ein etwas laengeres nachdenken und abwaegen stattfindet dafuer abba weniger kokurenzdenken und erster sein wollen.

Cheers

Tom

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo zusammen,

ich brauche mal Nachhilfe. Bei diesem Sript,

PositionsListe = {
  {x = -33.4, y = 4.6, z =  0},
  {x = -38.4, y = -2, z =  0},
  {x = -38.4, y = -5.4, z =  0},
  {x = 25.2, y = 4.6, z =  0},
  {x =  38.4, y = -2, z =  0}
}

function newOrder(Tabelle)
  for i = #Tabelle, 2, -1 do
    table.insert(Tabelle, table.remove(Tabelle, math.random(i)))   
  end
  return Tabelle
end

das ursprünglich von @Goetz stammt, sollen die fünf Klötzchen, die damit verbunden sind, so neu gewürfelt werden, dass keiner mehr an seinem alten Platz ist. Ich habe keinen blassen Schimmer, was in der Funktion da wie aufgerufen wird, bin aber wissbegierig.

HG

Brummi

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 29 Minuten schrieb Roter Brummer:

… bin aber wissbegierig.

Okay, der Kern der Geschichte ist folgender:

Alle 8 Möglichkeiten stehen in einer Tabelle. Da wir daraus fünf verschiedene haben wollen, müssen wir wie bei der Ziehung der Lottozahlen vorgehen. Wir spielen also 5 aus 8 statt 6 aus 49. Wir erzeugen eine Zufallszahl zwischen 1 und 8 und nehmen das Element aus der Tabelle. Jetzt sind nur noch 7 Elemente übrig. Also würfeln wir eine Zahl zwischen 1 und 7 und nehmen das Elemente ebenfalls raus. Dann würfeln wir eine Zahl zwischen 1 und 6 …

Die aussortierten Elemente müssen wir der Reihe nach irgendwo aufbewahren. Und weil wir beim nächsten Spiel wieder die ganze Tabelle als Anfangsstadium nutzen wollen, ist es praktisch die gewürfelten Elemente der Reihe nach hinten an die selbe Tabelle anzuhängen.

Die Zeile

for i = #Tabelle, 2, -1 do

erzeugt der Reihe nach Zahlen von 8 (#Tabelle enthält die Anzahl der Elemente in der Tabelle) runter bis 2. Das -1 an dritter Stelle sorgt dafür, dass bei jedem Durchgang eins runter gezählt wird und nicht - wie sonst üblich - rauf.

Beim ersten Durchlauf der Schleife steht in i also eine 8.

math.random(8) erzeugt eine zufällige ganze Zahl zwischen 1 und 8. 

table.remove() entnimmt der Tabelle, die im ersten Argument genannt wird, das Element, welches im zweiten Argument genannt wird.

table.remove(Tabelle, math.random(8)) nimmt also ein zufälliges Element zwischen 1 und 8 aus der Tabelle namens "Tabelle".

table.insert() setzt in der Tabelle, die als erstes Argument genannt wird, das ans Ende, was als zweites Argument genannt wird.

Und an zweiter Stelle steht die Funktion table.remove(). Damit wird das zufällige Element, welches table.remove rausholt, am Ende derselben Tabelle wieder angehängt.

Lottoziehung.jpg.6737585063dad20ce3cf04a26aa0af4a.jpg

Das 8. Element der Tabelle ist jetzt nicht mehr wichtig. Zur Auswahl stehen nur noch die ersten 7 Elemente der Tabelle. Beim zweiten Schleifendurchlauf steht deshalb in i eine 7. Wir würfeln eine zufällige Zahl zwischen 1 und 7, picken dieses Element aus der Tabelle und hängen es wieder hinten an.

 

Dann machen wir das Spiel mit den ersten 6 Elementen der Tabelle noch einmal. Und so weiter, bis wir alle 8 Elemente in zufälliger Reihenfolge in der Tabelle stehen haben.

Jetzt können wir die ersten 5 Elemente dieser Tabelle als unsere "Ziehung" präsentieren. (Wer genau verstanden hat, was passiert, der erkennt dass ich vergessen habe zum Schluss das erste Element nach hinten zu schieben. Da dieses Element aber jedes der 8 ursprünglichen Elemente sein kann, macht es für das Ergebnis keinen Unterschied.)

 

Die 8 Elemente der Tabelle sind in diesem Fall selber kleine Tabellen, welche die x, y und z Koordinaten enthalten. Deshalb muss die Liste 8 Koordinatengruppen enthalten. Du musst auch den 3 Würfeln einen (versteckten) Platz zuweisen, die diesmal am Ende der Auswahl gelandet sind und somit nicht mitspielen.

 

Bitte, lass mich wissen wie weit dir das hilft und wo du weiteren Erklärungsbedarf hast.

Bearbeitet von Goetz
Schreibfehler korrigiert
Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo Goetz,

die Sache ist die, dass ich an einem Timesaver arbeite. Es gibt nur noch fünf Klötzchen, die immer sichtbar sein sollen. Diese fünf sollen aber bei jedem Würfeln ausnahmslos die Position wechseln, damit alle Aufgaben gleich schwer sind und nicht eine Aufgabe leichter wird, weil eine (oder mehrere) Wagenposition(en) nicht gewechselt werden muss (müssen).

Deshalb hat die Tabelle nur fünf Einträge mit den bereits angepassten Koordinaten.

Im ausführenden Script gibt es demnach auch nur fünf Einträge.

PositionsListe = newOrder(PositionsListe)
$("Quader_A_1").transformation.position = PositionsListe[1]
$("Quader_A_2").transformation.position = PositionsListe[2]
$("Quader_A_3").transformation.position = PositionsListe[3]
$("Quader_A_4").transformation.position = PositionsListe[4]
$("Quader_A_5").transformation.position = PositionsListe[5]

Das funktioniert ja auch alles. Nur werden manchmal einige Klötzchen nicht getauscht. Reicht es, wenn ich an der Stelle

  for i = #Tabelle, 2, -1 do

die "2" durch eine "0" ersetze?

HG

Brummi

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 1 Minute schrieb Roter Brummer:

Es gibt nur noch fünf Klötzchen … Im ausführenden Script gibt es demnach auch nur fünf Einträge.

Okay, dann ist das natürlich richtig.

Aber für die "kein Klotz darf an seiner alten Position verbleiben" Anforderung (die natürlich sinnvoll ist!) muss ich mir noch etwas überlegen. Das leistet meine "Lottoziehung" nicht. Die von dir vorgeschlagene Änderung kann das auch nicht. Wir müssen da eine grundsätzlich andere Methode stricken.

Leider habe ich für die nächsten 8 Tage nur sporadisch Zeit, weil ich hier (zuhause) sehr in Anspruch genommen werde. Aber falls mir da in einer ruhigen Minute etwas einfällt, lasse ich es dich wissen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Kurz ein erster Einfall dazu:

Es gibt insgesamt nur 120 mögliche Stellungen. (5 x 4 x 3 x 2 x 1)

Die kann man alle in einer Tabelle auflisten und dann jeweils die ausschließen, die eine oder mehrere Positionen mit der aktuellen Stellung gemeinsam haben. Aus den verbliebenen würfelt man dann die neue Stellung. So sind Zufall und fünf neue Positionen immer garantiert. Das ist auf jeden Fall besser, als beliebige Zufallsergebnisse zu prüfen, ob sie eine gleiche Position enthalten und gegebenenfalls neu zu würfeln, bis man "Glück" hat.

Bearbeitet von Goetz
Link zu diesem Kommentar
Auf anderen Seiten teilen

Zweiter Ansatz:

Tausche zwei beliebige Positionen. Tausche von den verbliebenen drei wieder zwei Positionen. Tausche dann den letzten der fünf Klötze mit einem beliebigen der anderen vier.

Das ergäbe langfristig alle verfügbaren Muster und für den nächsten Wurf wäre garantiert, dass keiner der fünf Klötze an seinem Platz verbleibt. Aber für jeden Wurf stünde mit dieser Methode nur ein Teil der denkbaren Ergebnisse zur Verfügung. Deshalb finde ich es unbefriedigend und steuere es nur als Denkansatz bei.

 

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Es wird ganz normal gelost. Dann wird kontrolliert. Für alle 5 Plätze: Steht eine Farbe auf einem Platz, wo sie vorher schon war, wird sie mit einer beliebigen anderen getauscht. Sie ist nun sicher auf einem neuen Platz und die andere kann auch nicht auf der neuen Position gewesen sein.

Ich habe Dir's als Beispiel mal hinten angehängt. Ich weiß nicht, wie ihr es strukturiert habt, aber PositionsListe muß für meine Begriffe ins Masterskript,
und der Inhalt dort gleich an eine Arbeitstabelle (data) übergeben werden. Die ruft dann mit data = newOrder(data) immer neue Werte auf, ansonsten initialisiert sich PositionsListe bei jedem Aufruf neu. So eine angelegte Table scheint sehr hartnäckig readonly zu sein.
Die f in PositionsListe habe ich nur für die Testausgabe (EP) angelegt. Die können raus. Die old müssen bleiben.
Wahrscheinlich mußt Du Deine Positionsänderungen dann auf data umrouten. Naja, ist nur mal so ein Versuch. Götz wird's besser hinkriegen.

 

zufall_x.mbp

Bearbeitet von Andy
Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 7 Stunden schrieb Andy:

Götz wird's besser hinkriegen.

Du auch, Andy ;)

Wenn du deinen Versuch ausgeschlafen und bei Tage betrachtest.

Zum Beispiel gehört die Funktionsdefinition nicht in das Schalterereignis, sondern nur ein Funktionsaufruf. Du willst doch die Funktion nicht jedes Mal, wenn der Schalter betätigt wird, neu bauen sondern nur erneut ausführen.

Tabellen sind auch nicht "hartnäckig read only", wenn du das Pferd nicht von hinten aufzäumst.

Bearbeitet von Goetz
Link zu diesem Kommentar
Auf anderen Seiten teilen

Ach herrje. Das heißt also, dass er in jedem dieser Skripte wieder von vorne anfängt und 'durchparst' ? Ich dachte, der sammelt sich die Dinge so nach und nach zusammen und legt gerade Funktionen und Tables mehr oder weniger 'auf Halde'. Gut, wieder was gelernt. Was ich da heute Nacht auf der Suche nach einem fertigen swap-Befehl gesehen habe, da wird mir sowieso schwarz vor Augen. Wir sind ja noch sowas von am Anfang. Und mit der Umdenkerei brauche ich nie wieder C++ programmieren. Das geht schief.
Möchte wissen, wie Neo das gebacken kriegt. Aber mit der Tabelle weiß ich jetzt nicht,  wie ich's anders machen soll und warum das Pferd falschrum steht.

Gruß
  Andy

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 1 Stunde schrieb Andy:

Das heißt also, dass er in jedem dieser Skripte wieder von vorne anfängt und 'durchparst' ?

Nein, das heißt es nicht.

Ein Ereignis löst einen Funktionsaufruf aus. All das, was du einem Ereignis zuweist, ist also zusammen der Body einer Funktion. Und es ist nicht sinnvoll in einem Funktionsbody eine weitere Funktion zu definieren. Es ist nur sinnvoll innerhalb dieser Funktion weitere Funktionen aufzurufen.

Den Rest später, wenn ich den Kopf richtig frei habe. Aber deine Funktionsdefinition innerhalb einer Funktionsdefinition ist schon Teil des "Pferd von hinten aufzäumen" Problems.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo,

... hat mich natürlich auch interessiert... mein Lösungsansatz beruht darauf, dass jeder der 5 Würfel 5 Positionen einnehmen kann aber nur 4 einnehmen darf, da auf jeden Fall die Position getauscht werden soll. Jeder gesetzte Würfel schränkt die Möglichkeiten der verbliebenen Würfel ein. Bei 5 Würfel und 4 Positionen je Würfel, kann es sein, dass für dem letzten Würfel keine neue Position mehr überig bleibt. In diesem Fall mit einem beliebigen anderen Würfel tauschen... (die hintere Reihe im MBS-Projekt ist die alte Position...)
... ist alles in Lua9_9

Wuerfeln-4.mbp

Gruß
EASY

Link zu diesem Kommentar
Auf anderen Seiten teilen

Das ist im Wesentlichen nichts anderes als meine Version, die tauscht notfalls auch. Und wenn der Tauschplatz der eigene ist, wird hat der folgende genommen.
Aber irgendwie ist es wie immer. Die anderen kriegen den Daumen, der Andy die ganze Hand. Voll auf die Backe.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo Andy,

vor 3 Stunden schrieb Andy:

Das ist im Wesentlichen nichts anderes als meine Version, die tauscht notfalls auch. Und wenn der Tauschplatz der eigene ist, wird hat der folgende genommen.
Aber irgendwie ist es wie immer. Die anderen kriegen den Daumen, der Andy die ganze Hand. Voll auf die Backe.

... klingt so etwas nach Plagiat... 
... ich arbeite über Streichlisten und es gibt den Unterschied, dass es immer nur der letzte Würfel ist, der ggf. getauscht werden muss...

Gruß
EASY

Link zu diesem Kommentar
Auf anderen Seiten teilen

Erstelle ein Benutzerkonto oder melde dich an, um zu kommentieren

Du musst ein Benutzerkonto besitzen, um einen Kommentar verfassen zu können

Benutzerkonto erstellen

Neues Benutzerkonto für unsere Community erstellen.

Neues Benutzerkonto erstellen

Anmelden

Du hast bereits ein Benutzerkonto? Melde dich hier an.

Jetzt anmelden
×
×
  • Neu erstellen...