Bei Random Befehl einzelne (bereits erstellte) Zahlen ausschließen

  • Hallo an alle,

    Wie in der Überschrift ersichtlich möchte ich mit dem Random Befehl arbeiten, im Prinzip möchte ich mir damit
    per Zufall meine Lottozahlen generieren lassen.

    Das Script an sich ist bereits fertig, ich zerbreche mir aber bereits seit einigen Stunden den Kopf wie ich denn "doppelbenennungen" ausschließen kann.
    Denn bei 6 aus 49 gibt es ja jede Zahl nur einmal =)
    Habt ihr dazu eine Idee ?

    Hier mal das bisherige Script :

    Spoiler anzeigen
    [autoit]

    #include <ButtonConstants.au3>
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    $1 = Random(1,49,1) ;legt erste Zahl fest
    $2 = Random(1,49,1) ;legt zweite Zahl fest
    $3 = Random(1,49,1) ;legt dritte Zahl fest
    $4 = Random(1,49,1) ;legt vierte Zahl fest
    $5 = Random(1,49,1) ;legt fünfte Zahl fest
    $6 = Random(1,49,1) ;legt sechste Zahl fest

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    $Form1 = GUICreate("Lottozahlen", 192, 184, -1, -1) ;Erstellt Gui
    GUISetBkColor(0xFFFFFF) ; Färbt Gui Weiss

    [/autoit] [autoit][/autoit] [autoit]

    $Input1 = GUICtrlCreateInput("-", 48, 32, 30, 21) ;Ausgabefeld Zahl 1
    $Input2 = GUICtrlCreateInput("-", 48, 56, 30, 21) ;Ausgabefeld Zahl 2
    $Input3 = GUICtrlCreateInput("-", 48, 80, 30, 21) ;Ausgabefeld Zahl 3
    $Input4 = GUICtrlCreateInput("-", 112, 32, 30, 21) ;Ausgabefeld Zahl 4
    $Input5 = GUICtrlCreateInput("-", 112, 56, 30, 21) ;Ausgabefeld Zahl 5
    $Input6 = GUICtrlCreateInput("-", 112, 80, 30, 21) ;Ausgabefeld Zahl 6

    [/autoit] [autoit][/autoit] [autoit]

    $Label1 = GUICtrlCreateLabel("Ihre Gewinnzahlen diese Woche sind : ", 0, 0, 189, 17) ;Einfacher Text
    $Label2 = GUICtrlCreateLabel("Viel Glück !", 66, 120, 58, 17) ;Einfacher Text

    [/autoit] [autoit][/autoit] [autoit]

    $Button1 = GUICtrlCreateButton("Zahlen Bereitstellen", 40, 152, 107, 25) ;Auslösen der Funktion
    GUISetState(@SW_SHOW)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $Button1
    _Create ()
    EndSwitch
    WEnd

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _Create ()
    GUICtrlSetData($Input1,$1) ;gibt die Zahl 1
    GUICtrlSetData($Input2,$2) ;gibt die Zahl 1
    GUICtrlSetData($Input3,$3) ;gibt die Zahl 1
    GUICtrlSetData($Input4,$4) ;gibt die Zahl 1
    GUICtrlSetData($Input5,$5) ;gibt die Zahl 1
    GUICtrlSetData($Input6,$6) ;gibt die Zahl 1
    EndFunc

    [/autoit]

    Gruß und Danke , Eistee

  • Würde alle gezogenen Zahlen in ein Array schreiben.
    Wird dann eine neue Zahl gezogen, wird diese in dem Array gesucht.
    Wird diese gefunden, wird eine neue Zahl gezogen.

  • Hmm. ich raff das mit den Arrays wohl nicht ganz.. so läuft es nicht, gibt direkt einen Fehler in zeile 8 an...


    Spoiler anzeigen
    [autoit]

    #include <ButtonConstants.au3>
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Global $1
    $1[0] = Random(1,49,1) ;legt erste Zahl fest
    $1[1] = Random(1,49,1) ;legt zweite Zahl fest
    $1[2] = Random(1,49,1) ;legt dritte Zahl fest
    $1[3] = Random(1,49,1) ;legt vierte Zahl fest
    $1[4] = Random(1,49,1) ;legt fünfte Zahl fest
    $1[5] = Random(1,49,1) ;legt sechste Zahl fest

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    $Form1 = GUICreate("6 aus 49", 192, 184, -1, -1) ;Erstellt Gui
    GUISetBkColor(0xFFFFFF) ; Färbt Gui Weiss

    [/autoit] [autoit][/autoit] [autoit]

    $Input1 = GUICtrlCreateInput("-", 48, 32, 30, 21) ;Ausgabefeld Zahl 1
    $Input2 = GUICtrlCreateInput("-", 48, 56, 30, 21) ;Ausgabefeld Zahl 2
    $Input3 = GUICtrlCreateInput("-", 48, 80, 30, 21) ;Ausgabefeld Zahl 3
    $Input4 = GUICtrlCreateInput("-", 112, 32, 30, 21) ;Ausgabefeld Zahl 4
    $Input5 = GUICtrlCreateInput("-", 112, 56, 30, 21) ;Ausgabefeld Zahl 5
    $Input6 = GUICtrlCreateInput("-", 112, 80, 30, 21) ;Ausgabefeld Zahl 6

    [/autoit] [autoit][/autoit] [autoit]

    $Label1 = GUICtrlCreateLabel("Ihre Gewinnzahlen diese Woche sind : ", 0, 0, 189, 17) ;Einfacher Text
    $Label2 = GUICtrlCreateLabel("Viel Glück !", 66, 120, 58, 17) ;Einfacher Text

    [/autoit] [autoit][/autoit] [autoit]

    $Button1 = GUICtrlCreateButton("Zahlen Bereitstellen", 40, 152, 107, 25) ;Auslösen der Funktion
    GUISetState(@SW_SHOW)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $Button1
    _Create ()
    EndSwitch
    WEnd

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _Create ()
    GUICtrlSetData($Input1,$1[0]) ;gibt die Zahl 1
    GUICtrlSetData($Input2,$1[1]) ;gibt die Zahl 1
    GUICtrlSetData($Input3,$1[2]) ;gibt die Zahl 1
    GUICtrlSetData($Input4,$1[3]) ;gibt die Zahl 1
    GUICtrlSetData($Input5,$1[4]) ;gibt die Zahl 1
    GUICtrlSetData($Input6,$1[5]) ;gibt die Zahl 1
    EndFunc

    [/autoit]
  • Ungetestet und nur schnell im Forum runtergechrieben...

    Spoiler anzeigen
    [autoit]


    #include <ButtonConstants.au3>
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>

    [/autoit] [autoit][/autoit] [autoit]

    $Form1 = GUICreate("Lottozahlen", 192, 184, -1, -1) ;Erstellt Gui
    GUISetBkColor(0xFFFFFF) ; Färbt Gui Weiss

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    global $aInput[7]
    $left = 48
    $top = 32

    [/autoit] [autoit][/autoit] [autoit]

    for $i = 1 to 6
    if $i = 4 then
    $left = 112
    $top = 32
    endif
    $aInput[$i] = GUICtrlCreateInput("-", $left, $top, 30, 21) ; Ausgabefeld
    $top += 24
    next

    [/autoit] [autoit][/autoit] [autoit]

    $Label1 = GUICtrlCreateLabel("Ihre Gewinnzahlen diese Woche sind : ", 0, 0, 189, 17) ;Einfacher Text
    $Label2 = GUICtrlCreateLabel("Viel Glück !", 66, 120, 58, 17) ;Einfacher Text

    [/autoit] [autoit][/autoit] [autoit]

    $Button1 = GUICtrlCreateButton("Zahlen Bereitstellen", 40, 152, 107, 25) ;Auslösen der Funktion
    GUISetState(@SW_SHOW)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $Button1
    _Create ()
    EndSwitch
    WEnd

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _Create ()
    $i = 1
    do
    $neueZahl = Random(1,49,1)
    GUICtrlSetData($aInput[$i],$neueZahl)
    $bRetry = false
    for $j = 1 to $i-1
    if guictrlread($aInput[$j]) = $neueZahl then
    $bRetry = true
    exitloop
    endif
    next
    if not $bRetry then $i+=1
    until $i > 6
    EndFunc

    [/autoit]
  • @Awsome : deine Antwort passt zu deinem Nick ^^ mit der Anleitung von Bugfix hab ich das mit dem Array gleich gerafft =)
    jetzt muss ich nur noch herausfinden warum sich der Button nur einmal drücken lässt, und man das prog dann erst neu starten muss für neue zahlen.

    OffTopic : und weiss zufällig jemand wie ich in scite die Normalen Farben bekomme ? der extreme Rot Anteil nervt gewaltig...

    • Offizieller Beitrag

    Dazu hatte ich mal eine Funktion erstellt:

    [autoit]

    ;==============================================================================
    ; Gibt eine Anzahl Zufallszahlen ohne Doppel als String oder Array zurück
    ; Bereich von - bis festlegbar (positiv Integer)
    ; mit -1 für Anzahl werden alle Zahlen des Bereichs in zufälliger Reihenfolge
    ; ausgegeben
    ;==============================================================================
    Func _RandomExt($iBis, $iVon=1, $iAnzahl=-1, $array=0)
    Local $count = $iBis -$iVon +1
    If $iAnzahl = -1 Then $iAnzahl = $count
    Local $aValue[$count], $start = $iVon, $sOut = '', $random
    For $i = 0 To $count -1
    $aValue[$i] = $start
    $start += 1
    Next
    For $i = 0 To $iAnzahl -1
    $random = Random(0, $count -1 -$i, 1)
    $sOut &= $aValue[$random] & ','
    $aValue[$random] = $aValue[$count -1 -$i]
    Next
    $sOut = StringTrimRight($sOut, 1)
    If $array Then Return StringSplit($sOut, ',', 2)
    Return $sOut
    EndFunc ;==>_RandomExt

    [/autoit]
  • jetzt muss ich nur noch herausfinden warum sich der Button nur einmal drücken lässt, und man das prog dann erst neu starten muss für neue zahlen.


    Weil du nur einmal am Anfang Zufallszahlen generierst? In deiner create Funktion setzt du nur diese Werte in die Inputfelder, die werden sich zur Laufzeit aber nicht mehr ändern, daher siehst du auch keine Veränderung wenn du mehrmals auf den Button drückst. Schau dir mein Script an, das sollte wie gewünscht bei jedem Klick neue Zahlen erstellen.

    • Offizieller Beitrag

    Hier mal meine Variante:

    Spoiler anzeigen
    [autoit]


    #include <Array.au3>
    $aLotto = _Lotto()
    _ArrayDisplay($aLotto)

    [/autoit] [autoit][/autoit] [autoit]

    Func _Lotto()
    Local $aNumbers[49], $aWin[6]
    For $i = 0 To UBound($aNumbers) - 1
    $aNumbers[$i] = $i + 1
    Next
    For $i = 0 To UBound($aWin) - 1
    $iRandom = Random(0, 48 - $i, 1)
    $aWin[$i] = $aNumbers[$iRandom]
    $aNumbers[$iRandom] = $aNumbers[48 - $i]
    Next
    _ArraySort($aWin)
    Return $aWin
    EndFunc ;==>_Lotto

    [/autoit]
  • Hi,
    da MUSS ich doch meinen Senf dazugeben^^

    Spoiler anzeigen
    [autoit]


    $s = 7 ;magic number ^^
    $gui = GUICreate("Lottozahlen", $s ^ 3, $s ^ 3) ;GUI erstellen
    Dim $a[$s ^ 2+1], $z = 0 ;variablen definieren
    Do
    $rnd = Random(1, $s ^ 2, 1) ;zufallszahl erzeugen
    If $a[$rnd] = "" Then ;wenn noch nicht gezogen
    $a[$rnd] = $rnd ;belegen
    $z += 1 ;anzahl erhöhen
    EndIf
    Until $z = $s - 1 ;solange bis anzahl =6
    For $i = 0 To $s ^ 2 - 1 ;buttons erstellen
    GUICtrlCreateButton($i + 1, (Mod($i, $s)) * $s ^ 2, Int($i / $s) * $s ^ 2, $s ^ 2, $s ^ 2) ;buttons zeichnen
    If $a[$i+1] Then GUICtrlSetBkColor(-1, 0xFF0000);und wenn treffer, einfärben
    Next
    GUISetState() ;gui sichtbar machen
    While GUIGetMsg() <> -3 ;umd events abfangen
    WEnd

    [/autoit]

    ciao
    Andy


    "Schlechtes Benehmen halten die Leute doch nur deswegen für eine Art Vorrecht, weil keiner ihnen aufs Maul haut." Klaus Kinski
    "Hint: Write comments after each line. So you can (better) see what your program does and what it not does. And we can see what you're thinking what your program does and we can point to the missunderstandings." A-Jay

    Wie man Fragen richtig stellt... Tutorial: Wie man Script-Fehler findet und beseitigt...X-Y-Problem

    3 Mal editiert, zuletzt von Andy (20. August 2013 um 12:05)

  • hmmm, dann wird das Script aber HÄSSLICH!

    Spoiler anzeigen
    [autoit]

    $s = 7 ;magic number ^^
    $b = $s ;event vorbelegen für ersten start
    $gui = 0 ;dito
    While $b <> -3 ;solange bis fenster geschlossen
    If $b > 2 And $b < 52 Then ;irgendein button gedrückt
    If $gui <> 0 Then GUIDelete($gui) ;neue GUI
    $gui = GUICreate("Lottozahlen", $s ^ 3, $s ^ 3) ;GUI erstellen
    Dim $a[$s ^ 2 ], $z = 0 ;variablen definieren
    Do
    $rnd = Random(0, $s ^ 2-1, 1) ;zufallszahl erzeugen
    If $a[$rnd] = "" Then ;wenn noch nicht gezogen
    $a[$rnd] = $s ;belegen
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $rnd = ' & $rnd & @crlf & '>Error code: ' & @error & @crlf) ;### Debug Console
    $z += 1 ;anzahl erhöhen
    EndIf
    Until $z = $s - 1 ;solange bis anzahl =6
    For $i = 0 To $s ^ 2 - 1 ;buttons erstellen
    GUICtrlCreateButton($i + 1, (Mod($i, $s)) * $s ^ 2, Int($i / $s) * $s ^ 2, $s ^ 2, $s ^ 2) ;buttons zeichnen
    If $a[$i] Then GUICtrlSetBkColor(-1, 0xFF0000);und wenn treffer, einfärben
    Next
    GUISetState() ;gui sichtbar machen
    EndIf
    $b = GUIGetMsg() ;und events abfangen
    WEnd

    [/autoit]

    ciao
    Andy


    "Schlechtes Benehmen halten die Leute doch nur deswegen für eine Art Vorrecht, weil keiner ihnen aufs Maul haut." Klaus Kinski
    "Hint: Write comments after each line. So you can (better) see what your program does and what it not does. And we can see what you're thinking what your program does and we can point to the missunderstandings." A-Jay

    Wie man Fragen richtig stellt... Tutorial: Wie man Script-Fehler findet und beseitigt...X-Y-Problem

    Einmal editiert, zuletzt von Andy (20. August 2013 um 12:11)

  • Wenn jetzt noch jemand weiss wie ich das alte Syntax Highlightning hinbekomme bin ich rundum glücklich hehe


    Du meinst bei SciTE?
    Drück einfach mal Strg + 1, dann wechsel in das Tab "Color Settings" und dann drück unten auf den Button "New Scheme". In dem neuen Fenster wählst du im Dropdown dann einfach das "OldSciTE4AutoIt3" aus. Fertig ;)

    MfG

    There's a joke that C has the speed and efficieny of assembly language combined with readability of....assembly language. In other words, it's just a glorified assembly language. - Teh Interwebz

    C makes it easy to shoot yourself in the foot; C++ makes it harder, but when you do, you blow off your whole leg. - Bjarne Stroustrup
    Genie zu sein, bedeutet für mich, alles zu tun, was ich will. - Klaus Kinski

    • Offizieller Beitrag

    Aber nur bei Oscars und meiner Version sind für 6 Zahlen auch nur 6 Versuche erforderlich. ;)
    Alle anderen arbeiten nach dem Prinzip: Ziehe Zufallszahl solange, bis du eine noch nicht gezogene findest. Je kleiner die zur Verfügung stehende Zahlenmenge, desto länger kann das dauern. Denn wenn ich z.B. 2 aus 4 ziehen soll, erwische ich zu 50% immer dieselbe Zufallszahl.
    Bei Oscar und mir ist es völlig egal, welche Zufallszahl gezogen wird, da diese nur den Index des Ergebnisses liefert. Anschließend wird an diese Position der letzte Wert aus dem Zahlenraum geschrieben und der Bereich um eins verkleinert. Doppelziehung unmöglich, selbst wenn Random immer denselben Wert liefern würde. ;)

  • Ob Andy es herausgefordert hat ? :D

    [autoit]

    Dim $s = 7, $b = $s, $g = 0
    While $b <> -3 * Assign('b', GUIGetMsg())
    If (Not ($b > 2 And $b < 52)) And $g <> 0 Then ContinueLoop
    $g = GUICreate('Lottozahlen', $s ^ 3, $s ^ 3 + GUIDelete($g) * 0)
    Dim $a[$s ^ 2], $z = 0 ;variablen definieren
    Do
    $r = Random(0, $s ^ 2 - 1, 1) ;zufallszahl erzeugen
    If Not $a[$r] Then $a[$r] = $s + Assign('z', $z + 1) * 0 * ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $rnd = ' & $r & @CRLF & '>Error code: ' & @error & @CRLF)
    Until $z = $s - 1 ;solange bis anzahl =6
    For $i = 0 To $s ^ 2 - 1 ;buttons erstellen
    $z = GUICtrlCreateButton($i + 1, (Mod($i, $s)) * $s ^ 2, Int($i / $s) * $s ^ 2, $s ^ 2, $s ^ 2) + (($a[$i] <> '') And GUICtrlSetBkColor(-1, 0xFF0000)) + (($i = $s ^ 2 - 1) And GUISetState()) ; GuiSetState wird nur 1x ausgeführt
    Next
    WEnd

    [/autoit]
    Spoiler anzeigen
    [autoit]

    Dim $s=7,$b=$s,$g=0; - - - - |
    While $b<>-3*Assign('b' _; - |
    ,GUIGetMsg()); - - - - - - - |
    If(Not($b>2 And $b<52)) _; - |
    And $g<>0 Then ContinueLoop; |
    $g=GUICreate('Lottozahlen' _;|
    ,$s^3,$s^3+GUIDelete($g)*0); |
    Dim $a[$s^2],$z=0; - - - - - |
    Do; - - - - - - - - - - - - -|
    $r=Random(0,$s^2-1,1); - - - |
    If Not $a[$r] Then $a[$r]= _;|
    $s+Assign('z',$z+1); - - - - |
    Until $z=$s-1; - - - - - - - |
    For $i=0 To $s^2-1; - - - - -|
    $z=GUICtrlCreateButton($i+ _;|
    1,(Mod($i,$s))*$s^2,Int($i _;|
    /$s)*$s^2,$s^2,$s^2)+(($a[ _;|
    $i]<>'')And _; - - - - - - - |
    GUICtrlSetBkColor(-1, _; - - |
    0xFF0000))+(($i=$s^2-1) _; - |
    And GUISetState()); - - - - -|
    Next; - - - - - - - - - - - -|
    WEnd; - - - - - - - - - - - -|

    [/autoit]

    lg
    Mars

  • Zitat

    Ob Andy es herausgefordert hat ?

    Hat er!!!! 8o
    :thumbup: