• Offizieller Beitrag

    Der Glückstester von "nof@ker2" brachte mich auf die Idee auch mal so ein statistisches Lottoprogramm zu schreiben.

    Man kann 6 Zahlen eingeben und auswählen bei welchem Gewinn (3, 4, 5 oder 6 Richtige) das Programm abbrechen soll (Achtung! 6 Richtige dauert u.U. sehr lange!). Mit der [ESC]-Taste kann man den Vorgang abbrechen.

    Es werden am Schluß die Anzahl der Ziehungen, sowie die benötigte Zeit angezeigt. Während das Script läuft, wird ebenfalls die Anzahl der Ziehungen angezeigt. Um aber nicht die gesamte Rechenzeit für die Aktualisierung der Anzeige aufzubrauchen, wird nur alle 500 Ziehungen die Anzeige aktualisiert.

    Spoiler anzeigen
    [autoit]


    #include <ComboConstants.au3>
    #include <Array.au3>
    #include <GUIConstantsEx.au3>
    Opt('GUIOnEventMode', 1)

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

    Global $aLottoNum[49], $timer, $bBreak = False
    For $i = 1 To 49
    $aLottoNum[$i - 1] = $i
    Next

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

    GUICreate('Lottogewinn 6 aus 49', 510, 300)
    GUISetOnEvent($GUI_EVENT_CLOSE, '_End')
    GUISetBkColor(0xaaaaaa)
    HotKeySet('{ESC}', '_Break')
    Global $ahCheck[49]
    For $i = 0 To 48
    $ahCheck[$i] = GUICtrlCreateCheckbox($i + 1, 20 + Mod($i, 7) * 70, 10 + Int($i / 7) * 30, 60, 25)
    GUICtrlSetOnEvent(-1, '_CheckboxCounter')
    Next
    $hMatch = GUICtrlCreateCombo('3 Richtige', 10, 240, 75, 25, $CBS_DROPDOWNLIST)
    GUICtrlSetData(-1, '4 Richtige|5 Richtige|6 Richtige', '5 Richtige')
    GUICtrlSetTip(-1, 'Abbruchbedingung auswählen!')
    $hStart = GUICtrlCreateButton('Start', 90, 240, 50, 20)
    GUICtrlSetOnEvent(-1, '_Start')
    GUICtrlSetState($hStart, $GUI_DISABLE)
    GUICtrlCreateLabel('Anzahl der Ziehungen:', 150, 242, 130, 25)
    GUICtrlSetFont(-1, 10, 400)
    $hDrawCount = GUICtrlCreateLabel('0', 285, 242, 100, 25)
    GUICtrlSetFont(-1, 10, 400)
    $hStatus = GUICtrlCreateLabel(' 6 Zahlen auswählen!', 0, 280, 510, 20)
    GUICtrlSetBkColor(-1, 0xeeeeee)
    GUICtrlSetFont(-1, 12, 400)
    GUISetState()

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

    While True
    Sleep(10)
    WEnd

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

    Func _End()
    Exit
    EndFunc ;==>_End

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

    Func _Break()
    $bBreak = True
    EndFunc ;==>_Break

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

    Func _Start()
    Local $aTip[6], $iCount = 0, $aDraw, $iWin = StringLeft(GUICtrlRead($hMatch), 1)
    GUICtrlSetState($hMatch, $GUI_DISABLE)
    GUICtrlSetState($hStart, $GUI_DISABLE)
    For $i = 0 To 48
    If BitAND(GUICtrlRead($ahCheck[$i]), $GUI_CHECKED) Then
    $aTip[$iCount] = $i + 1
    $iCount += 1
    EndIf
    Next
    $iCount = 0
    GUICtrlSetData($hStatus, ' Bitte warten...')
    $timer = TimerInit()
    AdlibEnable('_DisplayTimer', 1000)
    Do
    $iCount += 1
    If $iCount / 500 = Int($iCount / 500) Then GUICtrlSetData($hDrawCount, $iCount)
    $aDraw = _Lottodraw()
    Until _Win($aTip, $aDraw, $iWin) Or $bBreak
    If Not $bBreak Then
    GUICtrlSetData($hStatus, ' Gewonnen!')
    MsgBox(0, 'Lottogewinn', 'Hurra, ' & $iWin & ' Richtige!' & @CRLF & 'Anzahl der Ziehungen: ' _
    & $iCount & @CRLF & 'Benötigte Zeit: ' & Round(TimerDiff($timer) / 1000, 3) & ' sek.')
    EndIf
    $bBreak = False
    GUICtrlSetData($hDrawCount, '0')
    GUICtrlSetData($hStatus, ' Start-Button anklicken!')
    GUICtrlSetState($hMatch, $GUI_ENABLE)
    GUICtrlSetState($hStart, $GUI_ENABLE)
    AdlibDisable()
    EndFunc ;==>_Start

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

    Func _DisplayTimer()
    GUICtrlSetData($hStatus, ' Bitte warten... Benötigte Zeit: ' & Int(TimerDiff($timer) / 1000) & ' sek.')
    EndFunc ;==>_DisplayTimer

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

    Func _Lottodraw()
    Local $aTmp = $aLottoNum, $aDraw[6], $iTmp
    For $i = 0 To 5
    $iRandom = Random(0, 48 - $i, 1)
    $aDraw[$i] = $aTmp[$iRandom]
    $aTmp[$iRandom] = $aTmp[48 - $i]
    Next
    _ArraySort($aDraw)
    Return $aDraw
    EndFunc ;==>_Lottodraw

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

    Func _Win($aTip, $aDraw, $iWin)
    Local $iCount = 0
    For $i = 0 To 5
    If $aTip[$i] = $aDraw[$i] Then $iCount += 1
    Next
    Return $iCount >= $iWin
    EndFunc ;==>_Win

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

    Func _CheckboxCounter()
    Local $iCount = 0
    For $i = 0 To 48
    $iCount += BitAND(GUICtrlRead($ahCheck[$i]), $GUI_CHECKED)
    Next
    GUICtrlSetData($hStatus, ' ' & 6 - $iCount & ' Zahlen auswählen!')
    If $iCount = 6 Then
    _CheckboxState($GUI_DISABLE)
    GUICtrlSetState($hStart, $GUI_ENABLE)
    GUICtrlSetData($hStatus, ' Start-Button anklicken!')
    Else
    _CheckboxState($GUI_ENABLE)
    GUICtrlSetState($hStart, $GUI_DISABLE)
    EndIf
    EndFunc ;==>_CheckboxCounter

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

    Func _CheckboxState($State)
    For $i = 0 To 48
    If BitAND(GUICtrlRead($ahCheck[$i]), $GUI_UNCHECKED) Then GUICtrlSetState($ahCheck[$i], $State)
    Next
    EndFunc ;==>_CheckboxState

    [/autoit]
  • sehr gute idee :) gefällt mir sehr gut :)
    Ich hab dich auf die idee gebracht *stolzsein* :)

    • Offizieller Beitrag

    Ganz so schlimm ist es dann nicht. Die Wahrscheinlichkeit auf einen 6er liegt bei 1 : 13.983.816

    Mein Script ist jetzt bei 1730 sek. und >10 Millionen Ziehungen...

    Edit: Hurra! 6 Richtige! Nach 2415 Sekunden und 14.270.759 Ziehungen (Ich weiß schon, warum ich kein Lotto spiele...). :huh:

    • Offizieller Beitrag

    Nein, denn zum einen werden beim Lotto die bereits gezogenen Zahlen nicht wieder in den "Topf" gelegt und zum anderen ist die Reihenfolge der Zahlen egal.
    Damit sind viele Kombinationen ausgeschlossen.
    Genaueres findest Du hier: http://de.wikipedia.org/wiki/Kombinatorik runterscrollen bis "Kombination ohne Zurücklegen".

    • Offizieller Beitrag

    Hallo

    Bei dieser Version sieht man wie oft 3,4,5 und 6 mal getroffen wurde.
    Diesmal kann die schleife nur mit ESC beendet werden!
    ScreenShot:
    autoit.de/wcf/attachment/4479/

    AutoIt Code
    [autoit]

    #include <ComboConstants.au3>
    #include <Array.au3>
    #include <GUIConstantsEx.au3>
    Opt('GUIOnEventMode', 1)

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

    Global $aLottoNum[49], $timer, $bBreak = False,$iCount = 0,$hListV_3,$hListV_4,$hListV_5,$hListV_6
    For $i = 1 To 49
    $aLottoNum[$i - 1] = $i
    Next

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

    GUICreate('Lottogewinn 6 aus 49', 510, 380)
    GUISetOnEvent($GUI_EVENT_CLOSE, '_End')
    GUISetBkColor(0xaaaaaa)
    HotKeySet('{ESC}', '_Break')
    Global $ahCheck[49]
    For $i = 0 To 48
    $ahCheck[$i] = GUICtrlCreateCheckbox($i + 1, 20 + Mod($i, 7) * 70, 10 + Int($i / 7) * 30, 60, 25)
    GUICtrlSetOnEvent(-1, '_CheckboxCounter')
    Next
    ;~ $hMatch = GUICtrlCreateCombo('3 Richtige', 10, 240, 75, 25, $CBS_DROPDOWNLIST)
    ;~ GUICtrlSetData(-1, '4 Richtige|5 Richtige|6 Richtige', '5 Richtige')
    ;~ GUICtrlSetTip(-1, 'Abbruchbedingung auswählen!')
    $hStart = GUICtrlCreateButton('Start', 10, 335, 490, 20)
    GUICtrlSetOnEvent(-1, '_Start')
    GUICtrlSetState($hStart, $GUI_DISABLE)
    GUICtrlCreateLabel('Anzahl der Ziehungen:', 150, 242, 130, 25)
    GUICtrlSetFont(-1, 10, 400)
    $hListV = GUICtrlCreateListView("Richtige|Anzahl",10,230,490,100)
    For $i = 3 To 6
    Assign("hListV_"&$i,GUICtrlCreateListViewItem($i&"|0",$hListV))
    Next

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

    $hStatus = GUICtrlCreateLabel(' 6 Zahlen auswählen!', 0, 360, 510, 20)
    GUICtrlSetBkColor(-1, 0xeeeeee)
    GUICtrlSetFont(-1, 12, 400)
    GUISetState()

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

    While True
    Sleep(10)
    WEnd

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

    Func _End()
    Exit
    EndFunc ;==>_End

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

    Func _Break()
    $bBreak = True
    EndFunc ;==>_Break

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

    Func _Start()
    Local $aTip[6], $aDraw, $iWin = StringLeft(6, 1),$i3,$i4,$i5,$i6
    $iCount = 0
    ;~ GUICtrlSetState($hMatch, $GUI_DISABLE)
    GUICtrlSetState($hStart, $GUI_DISABLE)
    For $i = 0 To 48
    If BitAND(GUICtrlRead($ahCheck[$i]), $GUI_CHECKED) Then
    $aTip[$iCount] = $i + 1
    $iCount += 1
    EndIf
    Next
    $iCount = 0
    GUICtrlSetData($hStatus, ' Bitte warten...')
    $timer = TimerInit()
    AdlibEnable('_DisplayTimer', 500)
    Do
    $iCount += 1
    ;~ If $iCount / 500 = Int($iCount / 500) Then GUICtrlSetData($hDrawCount, $iCount)
    $aDraw = _Lottodraw()
    Switch _Win($aTip, $aDraw)
    Case 3
    $i3 += 1
    GUICtrlSetData($hListV_3,"3|"&$i3)
    Case 4
    $i4 += 1
    GUICtrlSetData($hListV_4,"4|"&$i4)
    Case 5
    $i5 += 1
    GUICtrlSetData($hListV_5,"5|"&$i5)
    Case 6
    $i6 += 1
    GUICtrlSetData($hListV_6,"6|"&$i6)
    EndSwitch
    Until $bBreak
    If Not $bBreak Then
    GUICtrlSetData($hStatus, ' Gewonnen!')
    MsgBox(0, 'Lottogewinn', 'Hurra, ' & $iWin & ' Richtige!' & @CRLF & 'Anzahl der Ziehungen: ' _
    & $iCount & @CRLF & 'Benötigte Zeit: ' & Round(TimerDiff($timer) / 1000, 3) & ' sek.')
    EndIf
    $bBreak = False
    GUICtrlSetData($hStatus, ' Start-Button anklicken!')
    ;~ GUICtrlSetState($hMatch, $GUI_ENABLE)
    GUICtrlSetState($hStart, $GUI_ENABLE)
    AdlibDisable()
    EndFunc ;==>_Start

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

    Func _DisplayTimer()
    GUICtrlSetData($hStatus, ' Bitte warten... Benötigte Zeit: ' & Int(TimerDiff($timer) / 1000) & ' sek. ('&$iCount&' Ziehungen)')
    EndFunc ;==>_DisplayTimer

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

    Func _Lottodraw()
    Local $aTmp = $aLottoNum, $aDraw[6], $iTmp
    For $i = 0 To 5
    $iRandom = Random(0, 48 - $i, 1)
    $aDraw[$i] = $aTmp[$iRandom]
    $aTmp[$iRandom] = $aTmp[48 - $i]
    Next
    _ArraySort($aDraw)
    Return $aDraw
    EndFunc ;==>_Lottodraw

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

    Func _Win($aTip, $aDraw)
    Local $iCount = 0
    For $i = 0 To 5
    If $aTip[$i] = $aDraw[$i] Then $iCount += 1
    Next
    Return $iCount
    EndFunc ;==>_Win

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

    Func _CheckboxCounter()
    Local $iCount = 0
    For $i = 0 To 48
    $iCount += BitAND(GUICtrlRead($ahCheck[$i]), $GUI_CHECKED)
    Next
    GUICtrlSetData($hStatus, ' ' & 6 - $iCount & ' Zahlen auswählen!')
    If $iCount = 6 Then
    _CheckboxState($GUI_DISABLE)
    GUICtrlSetState($hStart, $GUI_ENABLE)
    GUICtrlSetData($hStatus, ' Start-Button anklicken!')
    Else
    _CheckboxState($GUI_ENABLE)
    GUICtrlSetState($hStart, $GUI_DISABLE)
    EndIf
    EndFunc ;==>_CheckboxCounter

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

    Func _CheckboxState($State)
    For $i = 0 To 48
    If BitAND(GUICtrlRead($ahCheck[$i]), $GUI_UNCHECKED) Then GUICtrlSetState($ahCheck[$i], $State)
    Next
    EndFunc ;==>_CheckboxState

    [/autoit]


    Mfg Spider

    • Offizieller Beitrag

    GtaSpider, die Idee ist auch nicht schlecht. Hab gerade mal 1.000.000 Ziehungen gemacht:
    Zeile 83 geändert:

    [autoit]

    Until $bBreak Or $iCount = 1000000

    [/autoit]


    Zeilen 84...88 auskommentieren.
    Ergebnis:
    3334 x 3 Richtige
    189 x 4 Richtige
    5 x 5 Richtige
    0 x 6 Richtige

    Schade, wenn die Gewinne konstant wären, könnte man noch den Gesamtgewinn ausrechnen.

  • bei etwa 1.003.000 komm ich auf das:
    3115 x 3 Richtige
    199 x 4 Richtige
    6 x 5 Richtige
    0 x 6 Richtige

    • Offizieller Beitrag

    Hallo

    Ich bekomme bei 1.000.000 Ziehungen folgendes Ergebnis (hab nicht so ein Glück :( )
    2572 x 3 Richtige
    149 x 4 Richtige
    5 x 5 Richtige
    0 x 6 Richtige

    Was mich auch mal interessieren würde: Wie lange braucht er bei euch für 1.000.000 Ziehungen? Hab grad Windows XP x64 drauf gespielt und wollt mal gucken ob das Teil wrkl schneller ist :D

    Mfg Spider

    Edit: Aha? Das ist interessant, wenn ich die Zahlen 1-6 nehme komme ich zu folgendem Ergebnis:
    1038 x 3 Richtige
    61 x 4 Richtige
    2 x 5 Richtige
    0 x 6 Richtige
    Mh, ist der Zufallsalgo wohl doch nicht so Zufällig wie immer gedacht ;P

    • Offizieller Beitrag

    Ich bin mir nicht sicher, ob man das nach 1.000.000 Durchgängen schon sagen kann. Das hört sich vielleicht viel an, aber ich denke bei den Wahrscheinlichkeitswerten beim Lotto sind diese Zahlen noch nicht aussagekräftig.

    Mein Rechner braucht für 1.000.000 Ziehungen 165 sek.
    Aber einen Vergleich zwischen 64 und 32Bit System musst Du doch wohl auf ein und demselben Rechner durchführen. Sonst ist das kein Vergleich.