1. Artikel
  2. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team
    4. Mitgliedersuche
  3. Forum
  • Anmelden
  • Registrieren
  • Suche
Dieses Thema
  • Alles
  • Dieses Thema
  • Dieses Forum
  • Artikel
  • Seiten
  • Forum
  • Erweiterte Suche
  1. Paules-PC-Forum.de
  2. Forum
  3. Programmierung
  4. XProfan
  5. Anregungen und Bugreports

Zufallszahlen mit RND()

  • H.Brill
  • 9. September 2022 um 17:50
  • H.Brill
    Stammuser
    Reaktionen
    497
    Beiträge
    1.183
    • 9. September 2022 um 17:50
    • #1

    Vielleicht mal so als Anregung an RGH :

    Könnte man Rnd(N1) auch ein Array von Ganzzahlen übergeben ?

    Also, daß Rnd() nur diejenigen Zahlen, die auch im Array sind, zufällig

    auswählt. Das Array könnte man ja bei jedem Durchlauf auf die

    verbliebenen Zahlen neu modifizieren.

    Hintergrund ist eine softwaremäßige Lotto-Ziehungsmaschine.

    Wenn man nun so eine Ausspielung 6 aus 49 betrachtet, sind es

    ja immer Einzelziehungen bei jedem Neustart der Trommel. Da

    ja dann immer eine Zahl fehlt, kommt ja die fortlaufende Nummerierung

    nicht mehr in Frage. Man sagt zwar so schön 6 aus 49, das wäre aber streng

    genommen nur dann, wenn die 6 gezogenen Zahlen nach einmaligem

    Mischen alle mit einem Plumps rausfallen würden.

    Theorethisch ist es ja so :

    1 Zahl aus 49 möglichen

    1 Zahl aus 48 möglichen

    1 Zahl aus 47 möglichen

    1 Zahl aus 46 möglichen

    1 Zahl aus 45 möglichen

    1 Zahl aus 44 möglichen

    Geht ja auch nicht anders, sonst hätten wir ja öfter doppelt gezogene Zahlen, wo dann

    immer ein weiterer Lauf nötig wäre, solange eine doppelte vorhanden wäre.

    Wenn Rnd() auch ein Array aktzeptieren würde, wäre so eine Ziehung mehr

    realitätsnäher.

    Ich frage auch deshalb, weil ich im Netz solche Online - Generatoren gesehen habe,

    denen man z.B. einen Pool an Wörtern mit Komma getrennt übergibt und dieser dann

    ein Wort zufällig auswählt. Da gibt es ja auch keine Sortierung bzw. Reihenfolge und

    die Unter- und Obergrenze ist variabel.

    Da würde man sich viel Overhead sparen oder hat jemand da noch eine andere Idee ?

    Ist auch nur mal als Gedankenanregung gedacht, damit das Forum hier wieder etwas

    belebt wird ;)

    Wir sind die XProfaner.

    Sie werden von uns assimiliert.

    Widerstand ist zwecklos!

    Wir werden alle ihre Funktionen und Algorithmen

    den unseren hinzufügen.

  • Volkmar
    Moderator
    Reaktionen
    6.935
    Beiträge
    6.888
    • 9. September 2022 um 19:20
    • #2

    Mal meine Variante, schnell mal zusammengeklöppelt. Der Beep kann noch raus, der zeigt an, wenn doppelte Zahlen ausgefiltert werden. Und sortiert ist das Ergebnis auch nicht.

    Code
    Randomize
    Declare Zahl&, Schleife&, Feld&, Doppel&, Liste&[]
    Print "Die Ziehung der Lottozahlen"
    
    Whileloop 7
      Schleife& = &Loop
      Zahl& = 1 + Rnd(48)
      Feld& = SizeOf(Liste&[])
      IfNot Feld&
        Liste&[0] = Zahl&
      Else
        Repeat
        WhileLoop Feld&
          Doppel& = 0
          If Liste&[&Loop - 1] = Zahl&
            Doppel& = 1
            Zahl& = 1 + Rnd(48)
            Beep
          EndIf
        EndWhile
        Until Doppel& = 0
        Liste&[Schleife& - 1] = Zahl&
      EndIf  
    EndWhile
    
    WhileLoop 6
      Print Liste&[&loop - 1]
      Sleep 200
    EndWhile
    
    Print "Zusatzzahl:", Liste&[6]
    Waitinput
    Alles anzeigen

    Beim Sortieren beachten, Liste&[6] ist die Zusatzzahl!

    Gruß Volkmar

  • H.Brill
    Stammuser
    Reaktionen
    497
    Beiträge
    1.183
    • 9. September 2022 um 19:36
    • #3

    Super, schon mal gut.

    Wir sind die XProfaner.

    Sie werden von uns assimiliert.

    Widerstand ist zwecklos!

    Wir werden alle ihre Funktionen und Algorithmen

    den unseren hinzufügen.

  • JörgG
    Stammuser
    Reaktionen
    573
    Beiträge
    1.190
    • 9. September 2022 um 23:59
    • #4

    hier meine Variante:

    Code
    Declare long pool[49], i, lz
    Print "6 aus 49"
    Randomize 
    For i, 6             '6 zahlen würfeln  
      lz = 1 + Rnd(48)
      While pool[lz]     'schleife startet, falls index für diese zahl bereits belegt
        lz = 1 + Rnd(48)
      EndWhile
      pool[lz] = 1       'index der gewürfelten zahl belegen
      Print lz,
    EndFor
    WaitInput
    Alles anzeigen

    Gruß Jörg

    Ideen gibt es viele - man muß sie nur haben...
    Linux Mint / LMDE / Antix

    Einmal editiert, zuletzt von JörgG (10. September 2022 um 00:08)

  • Pfannkuchengesicht
    Stammuser
    Reaktionen
    441
    Beiträge
    359
    • 10. September 2022 um 08:54
    • #5

    Bei alle den guten Ideen bis eben ein Hinweis: Alle digitalen Zufallsfunktionen sind nicht "absolut" zufällig, weil das Ergebnis sehr theoretisch reproduzierbar sind: Wenn alle Ausgangsbedingungen absolut identisch sind, käme immer dieselbe Zahlenfolge heraus. Stammt jetzt nicht von mir, habe das vor Längerem irgendwo gelesen. Ich glaube auch, dass die Lottozahl-Zieh-Maschine aus gutem Grund rein analog aufgebaut ist, nicht nur wegen der Optik.

    Natürlich gilt diese Betrachtung nicht für privaten Gebrauch, welcher Art auch immer.

    Was immer man sagt, es ist immer nur ein Teil dessen, was zu sagen wäre.

  • Volkmar
    Moderator
    Reaktionen
    6.935
    Beiträge
    6.888
    • 10. September 2022 um 09:09
    • #6

    Stimmt. Sollte aber Programmieren bekannt sein. Wenn ich die Zeile Randomize weglasse, habe ich sogar garantiert immer die gleiche Zahlenfolge, denn dann ist der Startwert immer konstant :)

    JörgG, sehr schön kompakt.

    Gruß Volkmar

  • H.Brill
    Stammuser
    Reaktionen
    497
    Beiträge
    1.183
    • 10. September 2022 um 10:13
    • #7

    Na dann noch eine Spielerei mit Zufallswörtern :

    Code
    DEF RandomWort(1) IF(Len(@$(1), ",") > 1, SubStr$(@$(1), 1 + RND(Len(@$(1), ",")), ","), "")
    Randomize
    Print RandomWort("Hans,Susi,Kurt,Maria,Gerd")
    
    WaitInput

    Kann man bestimmt auch für andere Zwecke gebrauchen. Müssen ja nicht unbedingt

    Namen sein.


    Hallo, Volkmar

    Schön, daß es dir gefällt.

    In meinem Alter brauche ich sowas. Lesen und Kreuzworträtsel (wegen dem händischen

    Schreiben der Buchstaben) sind ja schon gut. Wenn man dann noch zusätzlich etwas

    programmiert, hilft das ungemein, den Geist fit zu halten.

    Ich finde das als ideale Ergänzung und kann es beim Älterwerden nur empfehlen.

    Es sollte auch durchaus öfter mal etwas kniffliger sein und nicht nur einen Code runterschreiben.

    Wir sind die XProfaner.

    Sie werden von uns assimiliert.

    Widerstand ist zwecklos!

    Wir werden alle ihre Funktionen und Algorithmen

    den unseren hinzufügen.

    5 Mal editiert, zuletzt von H.Brill (10. September 2022 um 11:11) aus folgendem Grund: Ein Beitrag von H.Brill mit diesem Beitrag zusammengefügt.

  • H.Brill
    Stammuser
    Reaktionen
    497
    Beiträge
    1.183
    • 21. September 2022 um 14:05
    • #8

    Hier mal eine kleine Lottomaschine, die 6 mal eine Zahl zieht und danach die Superzahl.

    Wegen ArrDel geht es aber erst ab Version X3. Könnte man auch umfriemeln mittels einer

    anderen Liste, aus der man Einträge löschen kann. Nach jeder Ziehung einer Kugel fehlt diese

    ja beim nächsten Durchlauf. Es können ja nicht zwei gleiche gezogen werden.

    Code
    Declare Long zahl, szahl, xpos
    Declare Handle hpic, st, btn1, btn2
    Declare Long ende
    DEF RNDZahl(1) IF(Len(@$(1), ",") > 1, Val(SubStr$(@$(1), 1 + RND(Len(@$(1), ",")), ",")), "")
    
    ende = 0
    xpos = 10
    WindowTitle "Lotto - Ausspielung"
    Window 600, 250
    st   = Create("STATIC", %HWnd, 10, 10, 560, 80)
    btn1 = Create("Button", %HWnd, "Start", 10, 120, 60, 25)
    btn2 = Create("Button", %HWnd, "Ende",  100, 120, 60, 25)
    
    Mcls 560, 80, RGB(0,0,0)
    hPic = Create("hPic", 0, "&MEMBMP")
    StartPaint st
       DrawPic hPic, 0, 0; 0
    EndPaint
    
    WhileNot ende
      WaitInput
      If Clicked(btn1)
         StartPaint st
           DrawPic hPic, 0, 0; 0
         EndPaint
         xpos = 10
         Ausspielung()
      ElseIf Clicked(btn2)
         ende = 1
      EndIf
    EndWhile
    
    
    Proc Ausspielung
    Declare Long LZahlen[], GZahlen[], SZahlen[],apos
    SetSize LZahlen[], 49
    SetSize GZahlen[], 6
    SetSize SZahlen[], 10
    MAT LZahlen[] < 1
    MAT LZahlen[] + 1
    MAT SZahlen[] < 1
    UseCursor 2
    Whileloop 0, 5
      Randomize
      zahl = RNDZahl(ImplodeNum(LZahlen[]))
      GZahlen[&LOOP] = zahl
      apos = IndexOf(LZahlen[], zahl)
      ArrDel LZahlen[], apos, 1
      ' Hier die gezogene Zahl löschen, damit sie beim nächsten
      ' Durchlauf nicht wieder gezogen wird.
    EndWhile
      Randomize
      szahl = RNDZahl(ImplodeNum(SZahlen[]))
      SortArray(GZahlen[])
    WhileLoop 0, 5
      DrawKugel(xpos, GZahlen[&LOOP])
      Inc xpos, 70
      Sleep 400
    EndWhile
      Inc xpos, 70
      DrawKugel(xpos, szahl)
    UseCursor 0  
    EndProc
    
    Proc ImplodeNum
    Parameters S&[]
    ClearList
    If Move("ArrToList", S&[])
       DeleteString(0, GetCount(0) - 1)
       Return Move("ListToStr", ",")
    Else
       Return ""
    EndIf
    EndProc
    
    Proc SortArray
    Parameters Long ZZahlen[]
    ClearList
    Move("ArrToList", ZZahlen[])
    SortList 5
    Move("ListToArr", ZZahlen[])
    EndProc
    
    Proc DrawKugel
    Parameters Long x, gzahl
    StartPaint st
      Ellipse x, 10 - x + 60, 70
      DrawText x + 30, 35, Str$(gzahl), 6
    EndPaint
    EndProc
    Alles anzeigen

    Die Animation einer Trommel mit laufenden Kugeln (mit OGL ?) habe ich mir erspart.

    Viel Spaß damit. :)

    Wir sind die XProfaner.

    Sie werden von uns assimiliert.

    Widerstand ist zwecklos!

    Wir werden alle ihre Funktionen und Algorithmen

    den unseren hinzufügen.

  • JörgG
    Stammuser
    Reaktionen
    573
    Beiträge
    1.190
    • 22. September 2022 um 00:49
    • #9

    Jo - funktioniert.

    hab mal bissl probiert.

    2 Fragen zur Superzahl:

    1. ich hatte gelegentlich auch eine 0 - ist das normal?

    2. ist die Superzahl immer nur einstellig?

    PS:

    Hab dieses Lotto-Getöse tatsächlich noch nie gesehen :)

    Gruß Jörg

    Ideen gibt es viele - man muß sie nur haben...
    Linux Mint / LMDE / Antix

  • H.Brill
    Stammuser
    Reaktionen
    497
    Beiträge
    1.183
    • 22. September 2022 um 07:29
    • #10

    Hallo Jörg,

    Das mit der 0 stimmt. Habs im Netz nochmals nachgeschaut und

    auch bei lotto.de sieht man bei der History (gezogene Zahlen für

    einen gewissen Zeitraum), manchmal ein 0.

    Deswegen das extra Array von 0 - 9. Und die ist immer einstellig.

    Was du evtl. meinst, ist die Landeslotterie. Da wird die Spielschein-Nr.

    bzw. Losnummer auf Gewinn geprüft.

    Ich habe dir mal einen alten Tippschein angehängt. Da siehst du

    unter den Zahlenreihen auch die Superzahl und darunter in der

    großen eckigen Klammer die Losnummer für die Landeslotterie,

    was durch Super 6 und Spiel 77 abgelöst wurde. Anbei auch die

    Quoten.

    Dateien

    Tippschein.jpg 78,34 kB – 0 Downloads Spiel77.png 29,61 kB – 0 Downloads Super6.png 27,49 kB – 0 Downloads

    Wir sind die XProfaner.

    Sie werden von uns assimiliert.

    Widerstand ist zwecklos!

    Wir werden alle ihre Funktionen und Algorithmen

    den unseren hinzufügen.

    Einmal editiert, zuletzt von H.Brill (22. September 2022 um 07:47)

  • Volkmar
    Moderator
    Reaktionen
    6.935
    Beiträge
    6.888
    • 22. September 2022 um 08:53
    • #11

    Kurz gesagt, als Superzahl wird die letzte Ziffer der Nummer des Spielscheines verwendet. Also immer einstellig von 0 bis 9

    Gruß Volkmar

  • H.Brill
    Stammuser
    Reaktionen
    497
    Beiträge
    1.183
    • 22. September 2022 um 09:16
    • #12

    Ja, schau mal auf dem Qucktipp-Spielschein unter der letzten Zahlenreihe (14.)

    Da steht Superzahl 2

    Die scheint immer identisch mit der letzten Ziffer der Spielscheinnummer zu sein.

    Wir sind die XProfaner.

    Sie werden von uns assimiliert.

    Widerstand ist zwecklos!

    Wir werden alle ihre Funktionen und Algorithmen

    den unseren hinzufügen.

  • Volkmar
    Moderator
    Reaktionen
    6.935
    Beiträge
    6.888
    • 22. September 2022 um 09:23
    • #13

    Noch einen Link dazu, da wird es so beschrieben.

    Gruß Volkmar

  • JörgG
    Stammuser
    Reaktionen
    573
    Beiträge
    1.190
    • 22. September 2022 um 16:15
    • #14

    alles ok - ich glaub euch das schon :) - was auch immer an Gewinnspielen in dieser Richtung existieren, ich kenne sie alle nicht ;)

    Wollte nur sicher gehen, dass sich im ProgrammBeispiel #8 kein Fehler eingeschlichen hat.

    Interessant finde ich eher, wieviel Lösungsansätze bzw. -wege es für so eine Aufgabenstellung (Programmiertechnisch) geben kann und welche Techniken der Programmierer hierfür verwendet.

    Paar Kommentare im Code wären allerdings hilfreich, damit auch andere Leser schnell reinfinden und nicht gleich beim Nachvollziehen das Handtuch werfen ;)

    Mal abgesehen von der optischen Darstellung - also die Kugeln, sondern nur die Umsetzung Ziehungslogik bzw. die technisch korrekte Ermittlung der Zufallszahlen.

    Anforderung pro Ziehung ist ja:

    6 Zufallszahlen aus einer Reihe von 1-49 // keine mehrfach

    1 Zusatzzahl aus einer Reihe von 0-9

    Dies über eine einfache Oberfläche beliebig oft starten und anzeigen (gemäß der Vorlage von Heinz)

    Hätte mal Lust zu probieren, diese Volage vom Ergebnis her nachzubauen, nur halt technisch einen anderen Weg zu finden.

    Natürlich wird die RND-Funktion das Herzstück bleiben, aber die Logik drumherum halt - könnte vllt. ganz interessant werden..

    Gruß Jörg

    Ideen gibt es viele - man muß sie nur haben...
    Linux Mint / LMDE / Antix

  • H.Brill
    Stammuser
    Reaktionen
    497
    Beiträge
    1.183
    • 22. September 2022 um 17:39
    • #15

    Man braucht ja nicht unbedingt Arrays zu nehmen.

    List!(N) - List$(N) - List%(N) - List&(N) und Create("List", T)

    und natürlich auch die interne Listboxliste oder sonstige Stringlisten

    würden zwar auch gehen, nur müßte man jedesmal in eine echte

    Zahl umwandeln. Das Löschen eines Eintrages müßte man mit

    DeleteString machen. Daher waren die Arrays der beste Weg. Ansonsten

    ist ja codemäßig nicht sehr schwierig.

    Man muß bei jedem Durchlauf halt eines beachten :

    Bei der realen Ziehung wird ja auch nach jeder gezogenen Kugel

    die Maschine neu gestartet. Deshalb muß dies auch beachtet

    werden :

    1 Zahl aus 49 möglichen Zahlen

    1 Zahl aus 48 möglichen Zahlen

    1 Zahl aus 47 möglichen Zahlen

    1 Zahl aus 46 möglichen Zahlen

    1 Zahl aus 45 möglichen Zahlen

    1 Zahl aus 44 möglichen Zahlen

    Das war der hauptsächliche Knackpunkt bei meiner Maschine und deshalb

    kam mir ArrDel da sehr gelegen. Bei den früheren Profanversionen könnte

    man das auch mit Umkopieren der Arrays erreichen.

    Auch das ganze mit Bereichen zu machen, wäre interessant. Da kannst du deiner

    Kreativität freien Lauf lassen.

    Wir sind die XProfaner.

    Sie werden von uns assimiliert.

    Widerstand ist zwecklos!

    Wir werden alle ihre Funktionen und Algorithmen

    den unseren hinzufügen.

  • JörgG
    Stammuser
    Reaktionen
    573
    Beiträge
    1.190
    • 22. September 2022 um 20:55
    • #16

    Klar Arrays wären auch bei mir die erste Wahl - da bin ich deiner Meinung.

    Zitat von H.Brill

    1 Zahl aus 49 möglichen Zahlen

    1 Zahl aus 48 möglichen Zahlen

    1 Zahl aus 47 möglichen Zahlen

    1 Zahl aus 46 möglichen Zahlen

    1 Zahl aus 45 möglichen Zahlen

    1 Zahl aus 44 möglichen Zahlen

    Alles anzeigen

    ach so meinst du das. Das ist mir jetzt gar nicht aufgefallen, daß du das auch genau so umgesetzt hast - schau ich gleich nochmal genauer hin 8o

    Das ist in der Tat aufwändiger...

    Ich hätte einfach 6x immer aus 49 Zahlen gewürfelt und im Falle einer bereits gezogenen Zahl, einfach weiter gewürfelt, bis eine frische Zahl kommt und die dann als nächste neue Zahl präsentiert - und das eben solange, bis 6 Zahlen zusammen sind :)

    Wollte grade mal loslegen und das auch so bauen.

    Gruß Jörg

    Ideen gibt es viele - man muß sie nur haben...
    Linux Mint / LMDE / Antix

  • JörgG
    Stammuser
    Reaktionen
    573
    Beiträge
    1.190
    • 23. September 2022 um 02:02
    • #17

    hab das jetzt mal so umgesetzt, wie du es angedacht hast. Außer die Kugeldarstellung. Also das Konzept mit den tatsächlich immer weniger werdenden Kugeln.

    Hab auch noch versucht, den Zufall so zufällig wie möglich zu machen :)

    Hier die reine unkommentierte Version:

    Code
    Proc reset_trommel
     Declare long pool[49], lz 
     ClearList             
     Randomize
     AddString(0,"0")  'index 0 mit dummy belegen     
     WhileLoop 1,49         
      lz = 1 + Rnd(49)     
      While pool[lz]        
        lz = 1 + Rnd(49)
      EndWhile
      pool[lz] = 1          
      AddString(0,Str$(lz))
     EndWhile
    EndProc
    
    Proc start_ziehung
     Declare long ak, wz
     ak = 49            
     WhileLoop 1,6       
      Randomize 
       wz = 1 + Rnd(ak)  
       Print "===> Ziehung " + Str$(&loop) + "  Gewinn-Kugel-Nr: " + GetString$(0,wz)
       DeleteString(0,wz)                  
       Dec ak                            
       Sleep 350 + Val(GetString$(0,wz) * 2)  
     EndWhile
     Print "---> Superzahl: " + Str$(Rnd(9))
    EndProc
    
    window 900,700
    Declare integer aw
    aw = 6
    While aw = 6
      reset_trommel 
      start_ziehung
      Print
      aw = MessageBox("Neue Ziehung starten?","6 aus 49",36) 
    EndWhile
    end
    Alles anzeigen

    Und hier das Gleiche als kommentierte Testversion mit Debug/Testausgaben:

    Code
    Proc reset_trommel
     'zahlenpool 1-49 mit zufälliger reihenfolge füllen, um den zufall noch perfekter zu machen
     Print "Geduld, Liste wird mit 1-49 in zufälliger Reihenfolge gefüllt"
     Declare long pool[49], lz 
     ClearList              'listboxliste leeren //eignet sich für dieses vorhaben am besten
     Randomize
     AddString(0,"0")       'index 0 der liste vorbelegen, weil in der schleife nicht benötigt
     WhileLoop 1,49         'füllen   
      lz = 1 + Rnd(49)      'zahl zwischen 1 & 49 würfeln
      While pool[lz]        'schleife startet, falls index des kontroll-arrays für diese zahl bereits belegt
        lz = 1 + Rnd(49)
      EndWhile
      pool[lz] = 1          'index der gewürfelten zahl belegen
      AddString(0,Str$(lz)) 'gewürfelte zahl in die trommel (listboxliste) werfen 
     EndWhile
    EndProc
    
    Proc zeig_trommel
     'aktuellen inhalt zu kontrolle anzeigen
     Print "Aktuelle Trommel: " + Str$(%getcount) + " Kugeln"
     WhileLoop 1,49
       Print GetString$(0,&loop),
     EndWhile
       Print
    EndProc
    
    Proc start_ziehung
     Declare long ak, wz
     ak = 49            'anzahl der kugeln vor der ersten ziehung
     WhileLoop 1,6      '6 kugeln ziehen  
      Randomize 
      'zahl würfeln // in ak steht ja immer der aktuelle höchstwert
      'gewürfelt wird hier also nicht die kugel selbst, sondern der listenIndex der den wert der kugel enthält
       wz = 1 + Rnd(ak)  
       Print "===> Ziehung " + Str$(&loop) + "  Zufalls-Index: " + Str$(wz) + "  Gewinn-Kugel-Nr: " + GetString$(0,wz)
       DeleteString(0,wz)                  'die frisch gezogene Zahl aus der liste entfernen
       Dec ak                              'anzahl der kugeln um 1 verringern 
       Sleep 350 + Val(GetString$(0,wz) * 2)   'wartepause variieren (abhängig vom wert der gezogenen kugel) // dadurch wird randomize noch zufälliger gesetzt
       Print:Print
       zeig_trommel 'nur zur kontrolle // kann später weg
     EndWhile
     Print:Print "---> Superzahl: " + Str$(Rnd(9))
    EndProc
    
    window 900,700
    Declare integer aw
    aw = 6
    While aw = 6
      Cls
      reset_trommel 'trommel füllen
      sleep 1000
      Cls
      zeig_trommel  'nur zur kontrolle //kann später weg
      start_ziehung
      aw = MessageBox("Neue Ziehung starten?","6 aus 49",36)
    EndWhile
    end
    Alles anzeigen

    Gruß Jörg

    Ideen gibt es viele - man muß sie nur haben...
    Linux Mint / LMDE / Antix

  • H.Brill
    Stammuser
    Reaktionen
    497
    Beiträge
    1.183
    • 23. September 2022 um 07:37
    • #18
    Zitat von JörgG

    Ich hätte einfach 6x immer aus 49 Zahlen gewürfelt und im Falle einer bereits gezogenen Zahl, einfach weiter gewürfelt, bis eine frische Zahl kommt und die dann als nächste neue Zahl präsentiert - und das eben solange, bis 6 Zahlen zusammen sind

    Das macht aber dann die Abfragen komplizierter. Bei den ersten beiden gezogenen Kugeln geht es noch,

    aber nach der dritten, vierten und fünften Kugel wird es interessant. Da war das Löschen der gezogenen

    Kugeln aus dem Array einfacher, da man dann einfach immer einen frischen Satz der noch gültigen Kugeln

    beim nächsten Durchlauf hat. Du mußt ja immer die 49 Werte testen, weil die gezogenen Werte ja in diesem

    Bereich (1-49) liegen können. Einfacher wäre es, wenn die 49 als erstes usw. gezogen würde, aber das ist

    ja nur selten der Fall. Da geht u.U. dann auch eine Menge Zeit drauf, wenn du mit Rnd() solange ziehen mußt,

    bis keine der schon gezogenen Zahlen dabei ist. Finde ich höchst uneffizient.

    ach so meinst du das. Das ist mir jetzt gar nicht aufgefallen, daß du das auch genau so umgesetzt hast - schau ich gleich nochmal genauer hin 8o

    Ich kenne das, weil ich früher öfters samstags abends die Liveziehung mitverfolgt hatte. Da hatte ich gesehen, daß nach

    jeder gezogenen Kugel die Trommel neu anlief. Und logischerweise immer mit einer Kugel weniger.

    Wir sind die XProfaner.

    Sie werden von uns assimiliert.

    Widerstand ist zwecklos!

    Wir werden alle ihre Funktionen und Algorithmen

    den unseren hinzufügen.

  • JörgG
    Stammuser
    Reaktionen
    573
    Beiträge
    1.190
    • 23. September 2022 um 09:30
    • #19
    Zitat von H.Brill

    Das macht aber dann die Abfragen komplizierter. Bei den ersten beiden gezogenen Kugeln geht es noch,

    aber nach der dritten, vierten und fünften Kugel wird es interessant. Da war das Löschen der gezogenen

    Kugeln aus dem Array einfacher, da man dann einfach immer einen frischen Satz der noch gültigen Kugeln

    beim nächsten Durchlauf hat.

    Diesen Ansatz habe ich ja im Codebeispiel #4 realisert. Läuft bei 6 aus 49 relativ fix.

    Abfragetechnisch eher einfach - wie ich finde..

    Aber mich hat doch dein Konzept mit den immer weniger werdenden Kugeln in den Fingern gejuckt ;)

    Herausgekommen ist Codebeispiel #17

    Nebenbei:

    Übrigens mußte ich 1+ rnd(49) schreiben, sonst wird die 49 nie gewürfelt...

    Gruß Jörg

    Ideen gibt es viele - man muß sie nur haben...
    Linux Mint / LMDE / Antix

  • H.Brill
    Stammuser
    Reaktionen
    497
    Beiträge
    1.183
    • 23. September 2022 um 10:48
    • #20

    So o.ä. könnte man ein ArrDel in Profan Version 11.2 realisieren :

    Code
    Declare a&[]
    
    Cls
    WhileLoop 0, 9
      a&[&LOOP] = &LOOP + 1
    EndWhile
    
    Print "Alte Größe : ", SizeOf(a&[])
    
    ArrayDel(a&[], 3) 
    
    WhileLoop 0, SizeOf(a&[]) - 1
      Print a&[&LOOP]
    EndWhile
    
    Print "Neue Größe : ", SizeOf(a&[])
    
    Proc ArrayDel
    Parameters b&[], p&
    Declare L&
    L& = Create("List", SizeOf(b&[] - 1))
    WhileLoop 0, SizeOf(b&[]) - 1
       If b&[&LOOP] <> p&
          AddString(L&, Str$(b&[&LOOP]))
       EndIf   
    EndWhile
    SetSize b&[], GetCount(L&) - 1
    WhileLoop 0, GetCount(L&) - 1
        b&[&LOOP] = Val(GetString$(L&, &LOOP))
    EndWhile
    EndProc
    
    Waitkey
    Alles anzeigen

    Ich mußte auf eine Liste mit Create zurückgreifen. Ein b&[] = Arr&[] funktioniert nicht, weil Profan da immer

    eine 0 als Platzhalter für das gelöschte Element setzt. Ist jetzt nur für Long (&) - Arrays.

    Wir sind die XProfaner.

    Sie werden von uns assimiliert.

    Widerstand ist zwecklos!

    Wir werden alle ihre Funktionen und Algorithmen

    den unseren hinzufügen.

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!

Benutzerkonto erstellen Anmelden

Windows 11

  1. Datenschutzerklärung
  2. Impressum
Community-Software: WoltLab Suite™