[Lua] Lotto - der Zufallsgerator

CHDK-Skripte, CHDK-Entwicklung, PC-Zusatzprogramme, Informationen für Tüftler

Lotto - der Zufallsgerator

Beitragvon msl » 06.11.2008, 22:48

PhyrePhoX hat sich einen Zahlengerator gewünscht. :D

Hier mal der erste Ansatz. Den Ausschluß von Doppelungen habe erstmal weggelassen. Da habe ich bisher keine sinnige Idee. Vielleicht fällt jemand dazu was ein. :?

Es wird die gewünschte Anzahl von Zufallszahlen generiert und in ein Table geschrieben. Zur Ausgabe wird dieser Table sortiert und in eine Zeichenketten umgewandelt.

Syntax: [ Download ] [ Verstecken ]
Benutze Lua Syntax Highlighting
--[[
@title Lotto
@param n how many
@default n 6
@param r range
@default r 49
@param s start
@default s 1
@param e exclusive
@default e 1
]]


count = n
range = r
start = s
exclusive = e

repeat

  lotto = {}

    for i=1, count do

        number = math.random(start, range)

            table.insert(lotto,number)

    end
   
    table.sort(lotto)
    result = table.concat(lotto,", ")
   
    print("The result is:")
    print()
    print(result)
    print()
    print("Click a key for new.")
   
    wait_click(0)
    cls()
   
until false
Erstellt in 0.007 Sekunden, mit GeSHi 1.0.8.9
Benutzeravatar
msl
Super-Mod
Super-Mod
 
Beiträge: 4567
Bilder: 271
Registriert: 22.02.2008, 11:47
Wohnort: Leipzig
Kamera(s): A720 1.00c
SX220 1.01a

Beitragvon gehtnix » 07.11.2008, 01:45

Moin,

ein LösungsANSATZ könnte doch folgender sein. Ohne zu testen mal so im alten Stile getippt.
Der Sinn sollte aber doch nicht verloren gehen. Die If´s könnten vielleicht noch mit Select Case ersetzt werden.

statt

Code: Alles auswählen
 table.insert(lotto,number)
 
        end


mit diesem Ersetzen, und noch Ergänzen bis Nummer 7, die Zusatzzahl nicht vergessen! Die Zusatzzahl darf aber nicht in die Tabelle.

Code: Alles auswählen
if b=number then goto "neuenummer"
if c=number then goto "neuenummer"
if d=number then goto "neuenummer"
if e=number then goto "neuenummer"
if f=number then goto "neuenummer"
if h=number then goto "neuenummer"


if i=1 then
 a=number
 table.insert(lotto,number)
 goto "weiter"
end if

if i=2 then
 b=number
 table.insert(lotto,number)
 goto "weiter"
end if

if i=3 then
 c=number
 table.insert(lotto,number)
 goto "weiter"
end if

if i=4 then
 d=number
 table.insert(lotto,number)
 goto "weiter"
end if

:neuenummer
i=i-1
:weiter

end


Muß aber mal meinen Stacker fertig machen.

gruß gehtnix
Benutzeravatar
gehtnix
CHDK-Legende
CHDK-Legende
 
Beiträge: 2406
Bilder: 8
Registriert: 17.04.2008, 12:42
Wohnort: München
Kamera(s): A610 100e+f + IXUS990 IS

Beitragvon msl » 07.11.2008, 15:20

Solche if-Verkettungen kamen mir auch als erstes in den Sinn. Aber das ist genau die Art Code, die verhindert, dass das Skript flexibel bleibt.

PhyrePhox wollte ja gleichzeitig auch die Möglichkeit haben, das Skript als virtuelle Würfel zu verwenden.

Die Zusatzzahl habe ich mal weggelassen. Die kann man ja extra auslosen. :D

Damit es auch etwas Sinn als Beispiel für das CHDK-Paket macht, habe ich die 3 verschiedenen Schleifenarten benutzt und diverse Kamerafunktionen verwendet. Der Code ist sicherlich nicht optimal. Etwas besseres ist mir auf die Schnelle nicht eingefallen. :shock:



Syntax: [ Download ] [ Verstecken ]
Benutze Lua Syntax Highlighting
--[[

@title Lotto

@param n how many

@default n 6

@param r range

@default r 49

@param s start

@default s 1

@param e exclusive 1=on

@default e 1

@param z sound 1=on

@default z 1

]]




function button()

    local x = 0

    repeat

        wait_click(150)

        if is_pressed "set" then

            key = "SET"

            x = 1

        end

        if is_pressed "menu" then

            key = "MENU"

            x = 1

        end

    until  x == 1

    set_led (8,1)

    sleep (10)

    set_led (8,0)

    if sound == 1 then play_sound(4) end

end



function compare_number()

    for c=1, count do

            if lotto[c] == number then

                check = 1

            end

    end

end



--start script



count     = n

range     = r

start     = s

exclusive = e

sound     = z

check     = 0





repeat



  lotto = {}



    for f=1, count do

    lotto[f]=0

    end



    i = 1

    while i <= count do

        number = math.random(start, range)

        if exclusive == 1 then

            compare_number()

          if check == 1 then

              check = 0

              if i > 1 then i = i - 1 end

            else

            lotto[i] = number

            i = i + 1

            end

        else

            lotto[i] = number

            i = i + 1

        end

    end

           

    table.sort(lotto)

    result = table.concat(lotto,", ")

   

    print("dice [SET]     end [MENU]")

    print()

    print(result)

   

    button()

    cls()

   

until key == "MENU"
Erstellt in 0.009 Sekunden, mit GeSHi 1.0.8.9


Vielleicht kann es ja jemand verbessern und optimieren.

Gruß msl
Zuletzt geändert von msl am 05.12.2008, 14:00, insgesamt 1-mal geändert.
Benutzeravatar
msl
Super-Mod
Super-Mod
 
Beiträge: 4567
Bilder: 271
Registriert: 22.02.2008, 11:47
Wohnort: Leipzig
Kamera(s): A720 1.00c
SX220 1.01a

Beitragvon PhyrePhoX » 07.11.2008, 16:30

das hier ist mein versuch, hab noch nen schalter fürs sortieren drin.

es klappt aber nicht übrigens, zumindest nicht die exklusive variante. weiss noch nicht warum, hab auch noch keinen guten lua editor gefunden.
btw als ich msls script heute zum ersten mal ausprobiert hab hab ich direkt ne fehlermeldung bekommen, was daran lag dass ich seinen code ausm forum kopiert und direkt in die lua datei geschrieben habe - INKLUSIVE der zeilennummern. der browser kopiert die leider mit, was er nicht anzeigt beim markieren. deswegen: normale code tags sind besser als diese lua dinger.
Code: Alles auswählen
      --[[
      @title Lotto
      @param n how many
      @default n 6
      @param r range
      @default r 49
      @param s start
      @default s 1
      @param e exclusive
      @default e 1
     @param o sort
     @default o 1
      ]]
       
      count = n
      range = r
      start = s
      exclusive = e
      sort = o

         if (start>=range) then
          print("Wrong params, dumbass!")
          wait_click(0)
      else
       if ((exclusive == 1) and ((range-start+1)<count)) then
          print("Wrong params, dumbass!")
          wait_click(0)
       else
         repeat
            lotto = {}
        for f=1, count do
        lotto[f]=0
        end
              for i=1, count do
                number = math.random(start, range)
                if (exclusive == 1) then
                 for c=1, count do
                       if lotto[c] == number then
                        if i > 1 then i = i - 1 end
                       else  lotto[i] = number
                       end
                 end
                else
                lotto[i] = number
                end
              end
              if sort==1 then
              table.sort(lotto)
              end
              result = table.concat(lotto,", ")
              print("The result is:")
              print()
              print(result)
              print()
              print("Click a key for new.")
              wait_click(0)
              cls()
         until false
         end
         end


also wenn mir wer hilft den fehler zu finden bin ich sehr dankbar :D
Benutzeravatar
PhyrePhoX
CHDK-Begeisterter
CHDK-Begeisterter
 
Beiträge: 490
Registriert: 04.07.2008, 21:31

Beitragvon CHDKLover » 07.11.2008, 17:51

Hallo PhyrePhoX,
hab es zwar auch nicht testen können aber vielleicht ist es geschickter anstatt "if i > 1 then i = i - 1 end" einfach zu sagen "i=(i+1)%count".
Das Problem mit den Zeilennummern tritt nur unter Firefox auf, aber vorerst habe ich die Zeilennummern abgeschaltet.

CHDKLover
A610 100e CHDK-DE: aktuelle Version
Benutzeravatar
CHDKLover
Super-Mod
Super-Mod
 
Beiträge: 878
Bilder: 8
Registriert: 12.09.2007, 18:25
Wohnort: Dresden
Kamera(s): a610 100e

Beitragvon PhyrePhoX » 07.11.2008, 19:44

so, mit dem folgenden skript gehts:

Code: Alles auswählen
      --[[
      @title Lotto
      @param n how many
      @default n 6
      @param r range
      @default r 49
      @param s start
      @default s 1
      @param e exclusive
      @default e 1
     @param o sort
     @default o 1
      ]]
     
      count = n
      range = r
      start = s
      exclusive = e
      sort = o

         if (start>=range) then
          print("Wrong params, dumbass!")
          wait_click(0)
      else
       if ((exclusive == 1) and ((range-start+1)<count)) then
          print("Wrong params, dumbass!")
          wait_click(0)
       else
         repeat
        lotto = {}
        for f=1, count do
        lotto[f]=0
        end
        i = 1
              while i <= count do
                  number = math.random(start, range)
                  if (exclusive == 1) then
                  for c=1, count do
                       if (lotto[c] == number) then
                            check = 1
                        end
                  end
                  if (check == 1) then
                     check = 0
                  else
                      lotto[i] = number
                      i = i+1
                  end
                  else
                      lotto[i] = number
                      i = i+1
                  end
              end
              if sort==1 then
              table.sort(lotto)
              end
              result = table.concat(lotto,", ")
              print("The result is:")
              print()
              print(result)
              print()
              print("Click a key for new.")
              wait_click(0)
              cls()
         until false
         end
         end


ist natürlich alles andere als schön, ausserdem sollte es natürlich kommentiert werden, sonst wärs ja ein doofes anfängerskript. vielleicht kriegt msl da was nettes hin, muss auch nich mein skript sein, hauptsache es hat die geforderte funktionalität ;) witzig, endlich kann ich auch mal was fordern ^^
Dateianhänge
lotto.lua
(1.7 KiB) 470-mal heruntergeladen
Benutzeravatar
PhyrePhoX
CHDK-Begeisterter
CHDK-Begeisterter
 
Beiträge: 490
Registriert: 04.07.2008, 21:31

Beitragvon msl » 07.11.2008, 20:24

Ja, kann ich machen. Laß mir aber etwas Zeit. 8) Ich gehe davon aus, dass die Kommentierung direkt ins Skript soll.

Ich sehe, Du bist auch auf eine ähnliche Lösung gekommen. :D

2 Dinge sind mir aufgefallen.

Das Skript kann man ganz gut in Luaedit testen. Dazu braucht man nur die kameraspezifischen Befehle auskommentieren. Dann kann man sich die Ergebnisse in einer Konsole anzeigen lassen. Der print-Befehl funktioniert ja. Die repeat-Schleife muss natürlich auch ausgemacht werden.

Luaedit hat den Vergleich nil mit Zahl hingenommen. CHDK-Lua hat mit Fehlermeldung abgebrochen. Deshalb habe ich die Füllschleife gemacht.

Mit Luaedit konnte ich den Zähler in der for-Schleife zurücksetzen. Mit CHDK-Lua geht das nicht. Deshalb der Ausweich auf die while-Schleife.

Jetzt ist die Frage, welche Variante funktioniert richtig?

Gruß msl
Benutzeravatar
msl
Super-Mod
Super-Mod
 
Beiträge: 4567
Bilder: 271
Registriert: 22.02.2008, 11:47
Wohnort: Leipzig
Kamera(s): A720 1.00c
SX220 1.01a

Beitragvon PhyrePhoX » 07.11.2008, 21:03

jo, luaedit hab ich auch, das mit dem debuggen hab ich nicht hingekriegt. lustigerweise stürzt das programm ab ohne mir zu sagen dass da unbekannte befehle sind oder so. hab wait_click auskommentiert, aber trotzdem klappts nich. komisch.
jo die kommentierung soll direkt ins skript.
das mit dem zähler in der forschleife hat mich auch VERZWEIFELN lassen, wenn ich das mit dem debugger hinkriege dürfte mich das nächstemal nicht so wütend werden lassen, man hat ja leider garkeine andere möglichkeit.
ist die frage ob das ein bug in der lua implemenation ist oder nicht?!
hab mich bei deinem script bedient wie man sieht ;) halt noch die beiden abfragen am start hinzugefügt, wollen ja keine sinnlos und endlosschleifen. hm, weiss jetzt garnicht was passiert wenn man negative werte nimmt. geht sicher in die hose, also sollte man darauf auch noch testen.
den schalter fürs sortieren hab ich ja auch noch drin. und man sollte start/range in min/max umbennen für besseres VErständnis, oder?
danke jedenfalls!
Benutzeravatar
PhyrePhoX
CHDK-Begeisterter
CHDK-Begeisterter
 
Beiträge: 490
Registriert: 04.07.2008, 21:31

Beitragvon msl » 07.11.2008, 21:33

Ja stimmt, Luaedit ist nicht gerade die Offenbarung.

Ich hatte noch vergessen, dass natürlich die Parameter beim Testlauf vorgeben werden müssen. Das Progamm erkennt den Kopf ja nur als Kommentierung. Mit Lua Output, über View -> Debug Windows erreichbar, kann man dann eine Ausgabe simulieren.

Luaedit stürzt ab und zu ab. Deshalb häufig sichern. Beim Testlauf sollte man Endlos-Schleifen vermeiden, sonst rennt das Programm ins Nirvana. Die Stop-Funktion scheint nicht zu gehen.

Trotzdem ist das Skripten hier im Vergleich zu uBasic um Welten besser zu managen, schon wegen der Syntax-Kontrolle.

Ich habe unsere beiden Varianten zusammengeführt und werde das Skript dann noch kommentieren.

Gruß msl
Benutzeravatar
msl
Super-Mod
Super-Mod
 
Beiträge: 4567
Bilder: 271
Registriert: 22.02.2008, 11:47
Wohnort: Leipzig
Kamera(s): A720 1.00c
SX220 1.01a

Beitragvon Babul » 07.11.2008, 22:10

mich wuerde interessieren, wie viele schleifen durchlaufen werden, wenn man 48 aus 49 zahlen zieht. durch die staendige abfragerei con doppelten zahlen laeuft das script unnoetig lange, das ist algorithmisch bedingt, das brauch ich euch nicht zu sagen :)
mein vorschlag ist, eine hash-tabelle zu benutzen, ich stelle mir die ziehung eher so vor: (sorry, das mach ich jetzt aus dem kopf, fehler garantiert!)

Code: Alles auswählen
rem feld initialisieren
dim Zahl(49)
rem zahlen in tabelle schreiben...
for a=1 to 49
  zahl(a)=a
next a
rem zahlen durcheinanderwuerfeln
for a=1 to 49
  b=((a+rnd(48)-1) mod 49)+1
  swap zahl(a),zahl(b)
next a
rem falls es kein swap() gibt, einfach...
rem   puffer=zahl(a)
rem   zahl(a)=zahl(b)
rem   zahl(b)=puffer
rem ...benutzen!
for a=1 to 7
  print zahl(a)
next
sys 64738
Benutzeravatar
Babul
CHDK-Begeisterter
CHDK-Begeisterter
 
Beiträge: 79
Registriert: 07.08.2008, 18:39
Wohnort: Lindenfels

Beitragvon msl » 07.11.2008, 22:44

Na toll, da müht man sich hier als Amateur ab, weil bisher keiner Lust hat. Und dann wirft ein Profi mal so nebenbei eine brauchbare Lösung hin. :D :shock: :D

Wenn Du das ganze mal noch an Lua anpassen könntest, wäre das ganz groß. 8)

Dein Einwurf mit den 48 aus 49 war vollkommen richtig. So ab 30 wird es schwierig, ein schnelles Ergebnis zu liefern.

Gruß msl
Benutzeravatar
msl
Super-Mod
Super-Mod
 
Beiträge: 4567
Bilder: 271
Registriert: 22.02.2008, 11:47
Wohnort: Leipzig
Kamera(s): A720 1.00c
SX220 1.01a

Beitragvon gehtnix » 07.11.2008, 23:50

Hallo,

ich möchte ja mal nur no nebei einwerfen, das Script ist/wird ein Gewinnvermeidungsscript.

Selber spiele ich nur alle 5 Jahre mal ein Kästchen.
Aber, bis vor einer Woche habe ich für meine Nachbarin die nicht mehr die Wohnung verlassen konnte noch 3x ihren Lottoschein aufgegeben.
Bei der Abgabe erhält man einen Schein der Lottoagentur.
Mit diesem Schein kann man immer wieder dieselben Zahlen spielen, einschließlich dieser Sonderzahlen Spiel 77 usw..

Und da liegt jetzt sozusagen das Glück begraben.

Denn mit jedem neuen Scriptlauf würde ich ja andere Zahlen erhalten, auch wenn diese letzte Woche gezogen wurden!

Dennoch verstehe ich den Reiz von dem Script.

gruß gehtnix
Benutzeravatar
gehtnix
CHDK-Legende
CHDK-Legende
 
Beiträge: 2406
Bilder: 8
Registriert: 17.04.2008, 12:42
Wohnort: München
Kamera(s): A610 100e+f + IXUS990 IS

Beitragvon msl » 08.11.2008, 00:14

Wir können ja auch mal etwas zum Thema Gewinnchancen beim Lotto skripten. :D


So, hier noch der Lösungsansatz nach dem Babul-Muster.
Syntax: [ Download ] [ Verstecken ]
Benutze Lua Syntax Highlighting
--[[

@title Zufall

]]




count = 6

min   = 1

max   = 49



repeat



    array = {}

    result= {}



    for i = min, max do

        array[i] = i

    end



    for i = min, max do

        rnd = math.random(min, max)

        buffer = array[i]

        array[i] = array[rnd]

        array[rnd] = buffer

    end



    for c=1, count do

        result[c] = array[c]

    end



    table.sort(result)

    output = table.concat(result,", ")



    print(output)



    wait_click(0)



    cls()



until false
Erstellt in 0.007 Sekunden, mit GeSHi 1.0.8.9


Bedienung, Abfrage und einfaches Würfeln mit Doppelungen muss noch ergänzt werden. Dazu habe ich jetzt keine Lust mehr. :shock:

Gruß msl
Zuletzt geändert von msl am 05.12.2008, 14:01, insgesamt 1-mal geändert.
Benutzeravatar
msl
Super-Mod
Super-Mod
 
Beiträge: 4567
Bilder: 271
Registriert: 22.02.2008, 11:47
Wohnort: Leipzig
Kamera(s): A720 1.00c
SX220 1.01a

vorläufiges entgültiges Skript

Beitragvon msl » 09.11.2008, 12:49

Und hier nun noch die bedienerfreundliche Endvariante für den Würfel, der auch fotografieren kann. :D

Im Anhang befinden sich eine unkommentierte sowie eine englisch kommentierte Version entsprechend dem Wunsch von PhyrePhox (erwarte aber keine Wunderdinge :roll: ) .
Syntax: [ Download ] [ Verstecken ]
Benutze Lua Syntax Highlighting
--[[

@title lotto demo

@param n how many

@default n 6

@param r max

@default r 49

@param s min

@default s 1

@param e exclusive 1=on

@default e 1

@param o sort

@default o 1

@param z sound 1=on

@default z 1

]]




function button()                              

    local x = 0                                  

    repeat                                        

        wait_click(150)                            

        if is_pressed "set" then                  

            key = "SET"

            x = 1

        end

        if is_pressed "menu" then

            key = "MENU"

            x = 1

        end

    until  x == 1                                

    set_led (8,1)                                

    sleep (10)

    set_led (8,0)

    if sound == 1 then play_sound(4) end          

end



--start script



count     = n

min       = s

max       = r

exclusive = e

order     = o

sound     = z



if (min >= max) then

    print("Wrong params, dumbass!;-)")

    wait_click(0)

    else

    if ((exclusive == 1) and ((max - min + 1)<count)) then

        print("Wrong params, dumbass!;-)")

        wait_click(0)

        else

        repeat

          result= {}                                

            if exclusive == 1 then                    

                array = {}                              

                for i = min, max do                    

                    array[i] = i

                end

                for i = min, max do                    

                    rnd = math.random(min, max)          

                    buffer = array[i]                    

                    array[i] = array[rnd]

                    array[rnd] = buffer

                end

                for c=1, count do                      

                    result[c] = array[c]

                end

            else

                for i = min, max do                    

                    result[i] = math.random(min, max)    

                end

            end

            if order == 1 then table.sort(result) end

            output = table.concat(result,", ")        

        print("dice [SET]     end [MENU]")        

            print()

            print(output)                            

            button()                                  

            cls()                                    

        until key == "MENU"                        

end                                            

end
Erstellt in 0.013 Sekunden, mit GeSHi 1.0.8.9


Gruß msl
Dateianhänge
lotto_ec.lua
Lotto englisch kommentiert
(3.12 KiB) 457-mal heruntergeladen
lotto_01.lua
Lotto unkommentiert
(2.03 KiB) 918-mal heruntergeladen
Benutzeravatar
msl
Super-Mod
Super-Mod
 
Beiträge: 4567
Bilder: 271
Registriert: 22.02.2008, 11:47
Wohnort: Leipzig
Kamera(s): A720 1.00c
SX220 1.01a

Beitragvon PhyrePhoX » 09.11.2008, 18:55

super kommentiert, super skript, so möcht ich das sehen, danke! :)
jetzt kannste das natürlich noch irgendwie ins wiki übernehmen wenn du lust hast, ich sorg dafür dass es im trunk landet :D
Benutzeravatar
PhyrePhoX
CHDK-Begeisterter
CHDK-Begeisterter
 
Beiträge: 490
Registriert: 04.07.2008, 21:31

Nächste

Zurück zu Code-Ecke

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 28 Gäste