• Willkommen im Geoclub - dem größten deutschsprachigen Geocaching-Forum. Registriere dich kostenlos, um alle Inhalte zu sehen und neue Beiträge zu erstellen.

Zufallszahlen "verbrauchen"

FSNTL

Geocacher
Hallo,
ist es möglich Zufallszahlen zu "verbrauchen"?

wenn man zB. Lose zieht und Zufallszahlen von 1049 bis 1099 hat, soll natürlich (wenn eine Gewinnzahl gezogen wird) diese Zahl ungültig werden.

Danke und Gruß
Frank

Lose.JPG
 

Charlenni

Geomaster
Auf die Schnelle (es gibt gleich Essen ;) ): Tabelle mit allen Werten erstellen, Zufallszahl bestimmen (1 <= Zufallszahl <= max. Einträge), Wert "verbrauchen" und aus Tabelle löschen. Beim nächsten Mal ist dann die Tabelle um eins kleiner.
 

hcy

Geoguru
Entweder
a) alle Zufallszahlen (Gewinne) speichern und wenn verbraucht die Zahl löschen oder
b) die "verbrauchten" Zahlen speichern, wenn eine neue Zufallszahl generiert wird schauen ob man die schon hat und wenn ja eine neue generieren (und wieder zu b) gehen ;-)).
 

satanklaus

Geomaster
Wenn du z.B. 6 aus 49 spielt, kannst du dir doch zuerst die 6 Richtigen per Zufall erzeugen.
Jedes Losziehen ist auch zufällig, und du vergleicht diese Zahl mit der Liste der Richtigen.
Doppeltreffer werden aussortiert, z.B. +1


Gesendet von meinem XT1072 mit Tapatalk
 

schatzi-s

Geowizard
Je nach Anwendung kann auch der folgende Ansatz nuetzlich sein:

Wenn Du X einmalige "zufaellige" Zahlen benoetigst, kannst Du auch ein Feld aus X Elementen gefuellt mit den Zahlen von 1 bis X bilden.
Dieses Feld wird dann gemischt, in dem Du mehrfach zwei zufaellige Elemente aus dem Feld miteinander tauscht.
Beispiel:
1 2 3 4 5, 1 3 2 4 5, 3 1 2 4 5, 3 1 2 5 4...
Im spaeteren Programmverlauf verteilst Du dann einfach die Werte anhand dieser Liste von links nach rechts...
 

Charlenni

Geomaster
So, da diese Frage immer wieder auftaucht, habe ich mal ein Objekt erstellt, mit dem man das bewerkstelligen kann. Ich habe es RandomObjects genannt. Erstellt wird damit eine Tabelle, in der man beliebige Objekte speichern kann, die man dann zufällig (entweder mit zurücklegen oder ohne) abrufen kann. Da Urwigo keine Funktionen mit Parametern kann, muss dies allerdings in Lua benutzerdefiniertem Code erfolgen.

Wie geht es?
Die angehängte RandomObjects.lua in den Projektordner kopieren und bei den Cartridge Eigenschaften einen Haken bei "Inline Lua 'require'" setzen. Dann unter "Ansicht" die "Lua benutzerdefinierten Anweisungen" aufrufen. Dort "require "RandomObjects"" eintragen. Fertig.

Wie benutze ich es?
Am besten im Bereich "Variablen" eine normale Variable erstellen, damit alles beim Speichern korrekt berücksichtigt wird. Welchen Wert die Variable am Anfang hat, ist egal. In meinem Beispiel habe ich diese Variable "tabRandom" genannt. Achtung! So heißt die Kennung, die unbedingt angegeben werden muss, sonst klappt es nicht mit dem Lua-Zugriff.

Nun wird diese Variable mit den möglichen Werten initialisiert. Dies geht einfach mit einem Lua benutzerdefinierten Code. Dieser sieht wie folgt aus:
Code:
tabRandom = RandomObjects({100, 101, 102, 103, 104, 105, 106})
Es können aber auch Gegenstände oder Personen als Werte angegeben werden. Das sieht dann so aus (Kennung der Gegenstände/Personen müssen richtig hinterlegt sein):
Code:
tabRandom = RandomObjects({itemHammer, itemNagel, itemSeil, itemZange})
Wenn ihr nun einen zufälligen Wert haben möchte, dann gibt es zwei Funktionen: GetNext() und GetNextWithRemove(). Der Unterschied ist, dass die eine (GetNext) die Werte unberührt lässt, während die andere (GetNextWithRemove) den Wert aus den vorgegeben Werten löscht. Aufgerufen werden sie über:
Code:
wert = tabRandom.GetNext()
wert = tabRandom.GetNextWithRemove()
Was zurückkommt müsst ihr wieder einer Variable zuweisen. Wenn ihr das nicht möchtet, dann enthält die Eigenschaft "Last" immer den letzten zurückgegebenen Wert.

Zusätzlich gibt es noch Funktionen um nachzuschauen, ob es noch weitere Werte gibt (IsNext), um einen Wert hinzuzufügen (Add) oder einen bestimmten Wert zu entfernen (Remove). Ihr könnt auch die ursprünglichen Werte wiederherstellen (Reset).

Am besten die Demo-Cartridge durchschauen. Da wird alles mindestens einmal gezeigt :)

Ich habe es im Emulator, WhereYouGo und mit dem offiziellen iPhone Player getestet. Hat alles funktioniert. Sollte auf den anderen auch laufen

Wenn noch Wünsche oder Anregungen auftauchen, was noch möglich sein sollte, dann kurz melden.

Viel Spaß!
 

Anhänge

  • RandomObjects.zip
    10,6 KB · Aufrufe: 22

Charlenni

Geomaster
Sieht so aus, als ob die Tabelle das Abspeichern nicht überlebt. Habe deshalb den Aufruf der Funktionen ändern müssen. Was früher ein "." war wird nun zu einem ":". Der Aufruf sieht dann wie folgt aus
Code:
wert = tabRandom:GetNext()
wert = tabRandom:GetNextWithRemove()
Sollte mit der neuen Funktion auch nach dem Speichern noch funktionieren.
 

Anhänge

  • RandomObjects.zip
    10,9 KB · Aufrufe: 21

radioscout

Geoking
Wenn man einem Pseudozufallszahlengenerator immer den selben Startwert gibt, erhält man immer die selben Pseudozufallszahlen. Man muß nur die Anzahl der verbrauchten Pseudozufallszahlen speichern.
 
Oben