Jump to content

Zufallsgenerator


Empfohlene Beiträge

Hallo zusammen,

ich plane im Moment an einem Rangierspiel. Dazu brauche ich einen Zufallsgenerator, der aus 8 Waggons zufällig 5 in einer ebenfalls zufälligen Reihenfolge aussucht.

Zufall.thumb.jpg.08764c6bdac3d8a02a772dbb62b21a97.jpg

Das ist mir auch mit der Ereignisverwaltung insoweit gelungen. Die Quader stellen die Waggons dar und über den Taster wird neu gewürfelt.

Jetzt kann es manchmal vorkommen, dass für zwei oder mehrere Positionen dieselbe Zufallszahl gewürfelt wird und so zweimal oder auch öfter dieselbe Farbe erscheint. Hat jemand ein Idee, wie man diese Fälle verhindern kann?

Anbei die Beispieldatei.

Zufall.mbp

Vielen Dank für eure Hilfe

Brummi

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo Brummi,

Ich habe Dein Beispiel ein kleines bisschen "verändert":

Zufall-2.mbp

Deine ursprüngliche Schalter-Aktion habe ich ausgeblendet (siehe Ereignisgruppe "Original") und durch mehrere Ereignisdefinitionen in Ereignisgruppe "Vorschlag" ersetzt. Der wesentliche Punkt hierbei ist, dass Du bereits getroffene Auswahlen "ausblendest" und nur noch die bisher nicht gewählten Alternativen weiterhin zulässt. Entsprechend wird auch bei jedem weiteren Schritt das Zufalls-Interval verkleinert.

Bei mir hat sich ab und zu beim Drücken des Buttons nichts verändert. Das müsste dann wohl "zufällig" dieselbe Auswahl gewesen sein. Dass es aber bei mir etwas "gehäuft" aufgetreten ist, hat mich dann schon etwas gewundert. Eine Erklärung hierfür habe ich nicht.

Viele Grüße
BahnLand

 

Bearbeitet von BahnLand
Ich habe den von EASY entdeckten Fehler korrigiert. Danke, EASY!
Link zu diesem Kommentar
Auf anderen Seiten teilen

Hi ihr Beiden,
ich hab's mal mit einem Bubblesort versucht. Ich weiß nicht, ob die Zufälle nun verteilter sind als bei BahnLand.
Beim Tastendruck werden (Taste heißt jetzt var) die Objektvariablen v1-8 mit den Werten 1-8 bestückt und z-18 mit Zufallswerten bis 1000.
Dann läuft eine Schleife 8 mal und vertauscht die größeren Werte mit den zugehörigen Indizes nach oben.
Am Ende werden die 5 größten Indizes an Zufall1-5 gegeben. Aufwändiger, aber sicher.

Gruß
  Andy

  1.  

zufall_bubblesort.mbp

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo Brummi,

wie immer gibt es mehrere Möglichkeiten... ich habe Dein "Zufall erzeugen" auch mal ausgeblendet und die Ereignisgruppe "ZufallErzeugen2" daraus gemacht (sie ist anfänglich nicht aktiv!). mit dem Schalter werden alle Zufallszahlen auf 0 gesetzt und "ZufallErzeugen2" aktiviert. auf dieses Ereignis reagiert "Zahl1" und die erste Zufallszahl wird erzeugt. Dann wird die zweite Zufallszahl erzeugt und "Zahl2" aktiviert. (1) Mit dem aktivieren von "Zahl2" wird überprüft sich ob die 2. Zufallszahl sich von der ersten Zufallszahl unterscheidet. wenn ja, wird die 3. Zufallszahl erzeugt und "Zahl2" deaktiviert und "Zahl3" aktiviert. Wenn beide Zahlen gleich sind, wird eine neue Zufallszahl 2 generiert und "Zahl2" deaktiviert und dann gleich wieder aktiviert. damit sind wir wieder bei dem Punkt (1). Das Ereignis ruft sich also so lange selbst auf, bis die beiden Zahlen sich unterscheiden. Sind die Zahlen unterschiedlich, wird die 3. Zufallszahl erzeugt und "Zahl3" aktiviert. Mit dem aktivieren von "Zahl3" wird überprüft sich ob die 3. Zufallszahl sich von der ersten Zufallszahl und der zweiten Zufallszahl unterscheidet. wenn ja, wird die 4. Zufallszahl erzeugt und "Zahl3" deaktiviert und "Zahl4" aktiviert... wenn nicht, wird so lange eine neue 3. Zufallszahl erzeugt, bis sie einen Wert hat, der noch nicht vorkommt... usw.. bis zur 5. Zufallszahl....

Zufall_EASY1.mbp

P.S. ... so langsam hast Du die Qual der Wahl für eine Lösung:/

Gruß
EASY

Link zu diesem Kommentar
Auf anderen Seiten teilen

Deine Idee war auch meine Erste Easy, aber ich befürchtete mehr Tipparbeit :)
Mal sehen, was noch so eintrudelt.
BahnLand's Idee verwirrt mich etwas, das kann ich auf die Schnelle noch nicht nachvollziehen.

Grüße
  Andy

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo Andy,

der Trick ist folgender:

Es gibt einen Pool mit den Zahlen 1-8, hinterlegt in den Variablen Color1-Color8. Nun wird eine Zufallszahl zwischen 1 und 8 gewählt. Die Zahl gibt die Nummer an, aus welcher Color-Variable der Inhalt genommen werden soll (z.B. Zufallswert = 4: Wert aus Variable Color4 verwenden). Nun wird aber dieser Wert nicht direkt zugewiesen, sondern zuerst einmal nach vorne auf die erste Position verschoben, während alle Werte der Reihe bis zum ausgewählten Color-Wert um 1 nach oben gerückt werden (beim gewählten Beispiel: Inhalt von Color4 wird nach Color1, Inhalt von Color1 nach Color2, Inhalt von Color2 nach Color3 und Inhalt von Color3 nach Color4 verschoben). Nun befindet sich die erste gewählte Zufallszahl in Color1, während nie nächste Zufallszahl jetzt nur noch aus den Variablen Color2 bis Color8 ausgewählt werden darf.

Im zweiten Durchgang wird also eine Zufallszahl zwischen 2 und 8 gewählt, um nur noch zwischen den Inhalten von Color2 bis Color8 auszuwählen. Das kann jetzt theoretisch wieder der Zufallswert 4 sein, wobei aber nun in Color4 ein anderer Wert enthalten ist als beim ersten Durchgang, da die Zahlenreihe bis hierher um 1 nach oben verschoben wurde. Durch den obigen Algorithmus rutscht nun die erste gewählte Zahl nach Position 2 und die zweite gewählte Zahl nach Position 1.  Der dritte Durchgang beginnt erst mit Position 3 (Zufallszahl zwischen 3 und 8).

Beim fünften Durchgang kann Position 4 nicht mehr ausgewählt werden, weil die Zufallszahl nur noch zwischen 5 und 8 ausgewählt wird. Auch hier wird wieder der obige Algoritmus verwendet, um die zufällig ausgewählte Position nach vorne zu verschieben. Nach Abschluss des fünften Durchgangs (der Zähler steht jetzt auf 6), stehen in den ersten 5 Positionen die 5 ausgewählten Zufallszahlen, die alle verschieden sind (Color1 bis Color9 waren von Anfang an mit verschiedenen Zahlen initialisiert, die nur untereinander getauscht worden sind). Diese werden nun der Reihe nach den Variablen Zufall1 bis Zufall2 aus Brummi's ursprünglicher EV zugewiesen, um daraufhin die entsprechenden Würfel von Brummi sichtbar zu setzen.

Das war's.

Viele Grüße
BahnLand

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo @BahnLand,

vor 8 Stunden schrieb BahnLand:

Bei mir hat sich ab und zu beim Drücken des Buttons nichts verändert. Das müsste dann wohl "zufällig" dieselbe Auswahl gewesen sein. Dass es aber bei mir etwas "gehäuft" aufgetreten ist, hat mich dann schon etwas gewundert. Eine Erklärung hierfür habe ich nicht.

... hat mich jetzt doch interessiert, da Du ja immer wieder neue Startbedingungen hast, da die Variablenreihe "Color" nicht jedes mal neu initialisiert wird sondern die vorhergehende Reihe als Ausgangspunkt genommen wird...

... die Erklärung ist einfachB|... bei Dir hat sich ein kleiner Fehler eingeschlichen:/...

Beim Ereignis "Zufall1" hast Du als Trigger <Variable wird gesetzt "Zufall" ; Wert =2>
5b1c417dc26e0_Bild1.jpg.c47747d4a1e3e17535e8506e11d080e0.jpg

Bei dem Ereignis "Zufall2" hast Du richtigerweise den selben Trigger <Variable wird gesetzt "Zufall" ; Wert =2>
Durch diese doppelte Definition des Triggers kommt Dein System etwas durcheinander...

Wenn man den Trigger von "Zufall1" auf <Variable wird gesetzt "Zufall" ; Wert =1> setzt gibt es eigentlich immer neue Kombinationen (theoretisch ist natürlich bei allen Systemen eine Doppelung möglich...)

Gruß
EASY

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo nochmal,

ich möchte euch noch ein sehr spezielles Sortiersystem zeigen, was aber nur für 2^n 'Teilnehmer' funktioniert: Hier am Beispiel der 8:
Die oberste Zeile wäre ein normaler K.O.-Wettbewerb. 4 Spiele (Vergleiche) in der ersten Runde. Wer siegt, geht nach rechts, in diesem Fall geht der Verlierer dann nach
unten. Beim Dart- oder Tischtennisturnieren z.B. gibt es die sogenannte Trostrunde. Da ist man nach einer Niederlage noch nicht ausgeschieden, sondern wandert auf der Verliererseite weiter. Das entspricht hier der zweiten Zeile. Interessanterweise ist dieses System nun erweiterbar bis zur Vollständigkeit:

4  2      1  -> 1.
2  2  1  1  -> 2.
    1  1  1  -> 3.
1  1  1  1  -> 4.
8. 7. 6. 5.

Das wäre mit nur 20 Vergleichen wesentlich effizienter als Bubblesort.
Am allerschnellsten würde es wohl mit einer verlinkten Liste (wenn wir indiziert arbeiten könnten). Das wäre wie Kugelziehen aus der Lostrommel (also, wie bei Easy, nur ohne Risiko eines 'toten' Zuges). Beim ersten Mal wird Kugel(1-8) gezogen, der Knoten dann aus der Liste entfernt, dann wird Kugel(1-7) gezogen usw.
Ich habe da lange drüber gegrübelt, aber keine Lösung gefunden wie das hier umgesetzt werden könnte.
Am lustigsten wäre ein Lokrennen auf 8 Gleisen gewesen, Zufall auf die Beschleunigung und die Geschwindigkeit. Wer am Prellbock ankommt, wird zugewiesen :)

Ich bin von Euren beiden Programmen sehr beeindruckt, bei BahnLand wegen der Idee, und bei Easy wegen der genial effizienten Umsetzung.
So mit der EV zu balancieren, da brauche ich noch sehr viele Übungen wie diese. Deswegen seid mir nicht böse, wenn ich da versuche mitzumischen um Erfahrung zu sammeln. Außerdem bin ich Brummi richtig was schuldig.

Grüße
   Andy

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo Andy,

vor 7 Stunden schrieb Andy:

Das wäre wie Kugelziehen aus der Lostrommel ... Beim ersten Mal wird Kugel(1-8) gezogen, der Knoten dann aus der Liste entfernt, dann wird Kugel(1-7) gezogen usw.
Ich habe da lange drüber gegrübelt, aber keine Lösung gefunden wie das hier umgesetzt werden könnte.

Im Prinzip bin ich exakt nach dieser Methode vorgegangen. Nur muss ich zwischendurch "umsortieren", weil das mit dem "Entfernen" nicht so einfach geht. Auch mir hätten hier die Indizes sehr geholfen. Stattdessen habe ich die "Indirektion" über die Variablen Color1 bis Color8 gewählt (diese sind der "Ersatz" für die Indizes).

Viele Grüße
BahnLand

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo Andy,

vor 7 Stunden schrieb Andy:

Deswegen seid mir nicht böse, wenn ich da versuche mitzumischen...

... da vermisse ich jetzt daß ich kein "gefällt mir nicht" setzen kann...

vor 7 Stunden schrieb Andy:

... um Erfahrung zu sammeln.

.. wie denn sonst?;)

... Dein Lösungsansatz ist auch sehr interessant:)

Drei Leute... drei Lösungen... so etwas nennt man Informationsaustausch... und so soll es auch sein:D

Gruß
EASY

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo zusammen,

nochmals ganz herzlichen Dank für euer Engagement. Es funktioniert wie gesagt mit jedem der drei Systeme und sieht im Rangierspiel bisher dann so aus:

01.thumb.jpg.72d86526b0af7193155f9e622bf6630b.jpg

Und es macht Riesenspaß, die Aufgabe zu lösen. Obwohl es weniger Gleise für die eigentliche Aufgabe sind, ist es noch kniffliger als der Timesaver von John Allen.

HG

Brummi

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 1 Jahr später...

Hallo zusammen,

ich hole das Thema nochmals ans Tageslicht, weil es jetzt mit V5 nicht mehr funktioniert. Das Problem sind wohl auch nicht eure Lösungen, sondern, dass die komplette Sichtbarkeitssteuerung aus meinem ersten Beitrag hier nicht mehr funktioniert. Diese habe ich jetzt so umgestrickt, dass sie wieder läuft. Dabei sind die Quader B bis E als LUA-script dargestellt, weil hier immer nur ein Buchstabe geändert werden musste. Das ging so schneller.

Zufall2.mbp

Dann habe ich den halben Tag probiert, eure Lösungen einzupflegen, allein, es gelang mir nicht. Ich kriege es einfach nicht hin, dass immer fünf unterschiedliche Farben angezeigt werden.

Wer hat Lust?

HG

Brummi

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hi Brummi

Ich habe hier eine loesung die bei mir sowohl in V4 als auch in V5 laeuft

Die untere waagrechte reihe gibt jeder moeglichen konfiguration einen individuellen zahlenwert der gleichzeitig der name eines objektes oder nun in V5 einer objektvariablen sein muss. Die gelben felder symbolisieren vergebene wahlmoeglichkeiten (farben in deinem beispiel).die nummern in den spalten sind was in den jeweiligen objectvariablen entweder als nummern oder nummernbereich eingegeben werden muss. Fuer jede individuelle auswahlnummer muss noch eine entsprechende objektvariable mit der entsprechenden farbe (oder was auch sonst gewaehlt werden koennte) angelegt werden >301=rot, 302=blau,  303=gruen, 304=gelb, 305=braun, ( sehe gerade das da ein fehler in auswahl 14 ist, der muss dann mit 325 (fur 305)=blau und 326 (fuer 306)=gelb kuriert werden.

Auswah1l.thumb.JPG.ad247ab182daa3c61c7359b757f16e10.JPG

Auswah2l.thumb.JPG.ce71be8dec412aa7ec2243e49e763eb1.JPG

Zugegeben eine eher "mechanische" vorgehensweise...abba laeuft.

Fuer 8 auswahloptionen muss sie noch entsprechend erweitert werden nach diesem prinzip (die einzel-"fallkennungszahlen" muessen primzahlen sein)

Cheers

Tom

Auswahl.JPG

Bearbeitet von metallix
Link zu diesem Kommentar
Auf anderen Seiten teilen

Hier haddu wieder. Meine alte läuft wirklich nicht unter V5, weil die alte (s.o.) Funktion _Random1000 nun als Text übersetzt. Freßchen für @Neo

zufall_bubblesort-v5.mbp

p.s. Ich schätze, wenn Götz wieder hier ist, macht er da eine superelegante superkurze Lua-Lösung. Ich glaube, das müßte mit einem Table, 'pairs' und 'sort' in ganz wenigen Zeilen gehen. Aber ich habe in der eigenen Anlage wieder einen tiefgreifenden Schritt vorgenommen und die ist noch nicht ganz rund.

Bearbeitet von Andy
ps
Link zu diesem Kommentar
Auf anderen Seiten teilen

Tut's doch! Kann es sein, dass Du Rot und Orange als eine Farbe gesehen hast?

Und wenn Du gerade was im MBS laufen hast, nutzt der Doppelklick hier nichts, dann wird die nicht geladen.

Bearbeitet von Andy
Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 9 Stunden schrieb Andy:

wenn Götz wieder hier ist ...

Auf die Schnelle und nur mit Zahlen:

Quader = {1, 2, 3, 4, 5, 6, 7, 8}

function newOrder()
	for i = #Quader, 2, -1 do
		table.insert(Quader, table.remove(Quader, math.random(i)))
	end
	print(Quader[1], Quader[2], Quader[3], Quader[4], Quader[5])
end

newOrder()

Die Funktion newOrder wäre die Aktion, die man per Knopfdruck aufruft.

table.remove entfernt ein Element aus der Tabelle und gibt dieses Element zurück. Nimmt man den Rückgabewert als zweites Argument für table.insert, dann setzt table.insert das Element ans Ende der Tabelle, dass table.remove entfernt hat. Weil die Tabelle bunt verwürfelt wird, kann man anschließend die ersten fünf Elemente anzeigen und hat so garantiert fünf verschiedene und zufällige Elemente.

Mangels Zeit muss ich es dir überlassen die Sache mit Klötzen umzusetzen. Sorry.

 

Vorschlag:

Ich würde in der Tabelle nicht die Bauklötze, sondern ihre Positionen und ihre Sichtbarkeit verwalten. Und dann nach dem "Würfeln" allen 8 Klötzen aus dieser Tabelle einen Platz und ein sichtbar/unsichtbar zuweisen. So benötigt man nur 8 Klötze.

Bearbeitet von Goetz
Vorschlag ergänzt.
Link zu diesem Kommentar
Auf anderen Seiten teilen

Es hat mir dann doch keine Ruhe gelassen. 

Und der Enkelsohn sitzt neben mir und schaut zu.

Anmerkung:
Die erste Fassung hatte noch einen Fehler, weil meine Routine in eine Endlosschleife geriet, die nur dank Neos Limitierung bei Schleifen nach 25 Durchgängen verlassen wurde. Dieser Fehler ist jetzt behoben.

 

Wuerfeln.mbp

Bearbeitet von Goetz
Fehler in Beispielanlage korrigiert!
Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo Andy,

vor 10 Stunden schrieb Andy:

Tut's doch!

Hmm. Komisch gestern Abend hatte ich mehrfach gleiche Farben.

vor 10 Stunden schrieb Andy:

Kann es sein, dass Du Rot und Orange als eine Farbe gesehen hast?

Farbenblindheit liegt, glaube ich zumindest, bei mir nicht vor.

Danke für die Umsetzung.

@Goetz,

Danke für das Beispiel, muss ich mal studieren.

HG

Brummi

Edit: Vergessen auf Abschicken zu drücken.

Bearbeitet von Roter Brummer
Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 26 Minuten schrieb Roter Brummer:

ich wusste doch, dass ihr darauf anspringt

Es ist ein gutes Beispiel für die Möglichkeiten, die Lua eröffnet.

Und dafür, warum auch diejenigen von Lua profitieren werden, die selber nicht programmieren. Denn sie werden zukünftig mehr interessante Anlagen wie dein Rangierspiel bekommen. Und du kannst mittels Lua sogar überprüfen, ob die Aufgabe gelöst wurde.

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...