AutoIt und die Zufallszahlen

  • Moinz!

    Um einem Computerneuling zu demonstrieren, dass bei einem Computer Zufall!=Zufall ist (jedenfalls in "kurzen" Schleifen), habe ich folgendes Miniscript geschrieben.

    Im ersten Teil werden einfach Zufallszahlen zwischen 1 und der Breite der GUI erzeugt und grafisch als Länge eines Balkens dargestellt. Ist der untere Rand der GUI erreicht, wird die häufigste Zufallszahl ausgegeben.

    Beim zweiten Teil startet das Script in der Mitte der GUI und wendet sich, je nach dem Ergebnis der Random-Funktion zwischen 1 und 4 einer Himmelsrichtung zu und markiert das dortige Pixel mit einer Farbe. Wird der Rand der GUI erreicht, wird das Script beendet.
    Die Frage lautet: Ab welcher Größe der quadratischen GUI läuft der Algorithmus unendlich lange? :D

    Spoiler anzeigen
    [autoit]


    #include <gdiplus.au3>

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

    _GDIPlus_Startup()
    $width = 500
    $height = 500

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

    $hgui = GUICreate("Random Viewer", $width, $height)
    GUISetState()
    $hGraphic = _GDIPlus_GraphicsCreateFromHWND($hgui)
    $hPen = _GDIPlus_PenCreate()

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

    Dim $a[$width + 2]
    $max = 0
    While $a[$max] < $height
    $random = Random(1, $width, 1)
    _GDIPlus_GraphicsDrawLine($hGraphic, $random, $a[$random], $random, $a[$random] + 1, $hPen)
    $a[$random] += 1
    If $a[$random] > $max Then $max = $random
    WEnd

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

    MsgBox(0, "häufigste Zahl zwischen 1 und " & $width, $max)

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

    _GDIPlus_GraphicsClear($hGraphic)
    $x = Int($width / 2) ;startpunkt mitte
    $y = Int($height / 2)
    Do
    $random = Random(1, 4, 1)
    Switch $random
    Case 1 ;rechts
    $x += 1
    $col = 0xFF0000FF
    Case 2 ;links
    $x -= 1
    $col = 0xFF00FF00
    Case 3 ;oben
    $y -= 1
    $col = 0xFFFF0000
    Case 4 ;unten
    $y += 1
    $col = 0xFF000000
    EndSwitch
    $hPen = _GDIPlus_PenCreate($col)
    _GDIPlus_GraphicsDrawLine($hGraphic, $x, $y, $x, $y + 1, $hPen)
    Until $x < 0 Or $x > $width Or $y < 0 Or $y > $height ;ende, wenn rand erreicht

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

    MsgBox(0, "", "Ende")

    [/autoit] [autoit][/autoit] [autoit][/autoit]
  • Das sieht ja mal interessant aus.
    Quasi ein in Echtzeit laufendes Histogramm. :thumbup:

    Zitat

    dass bei einem Computer Zufall!=Zufall ist (jedenfalls in "kurzen" Schleifen),

    Das sehe ich nicht so.
    Bei kurzen Schleifen ist die Stichprobenmenge kleiner. Die perfekten Zufallsverteilungen Gleichverteilung, Standardnormalverteilung etc. gelten aber streng genommen nur für den Fall das die Stichprobenmenge gegen unendlich geht.
    Bei kleinen Stichprobenmengen können die Abweichungen von der Idealverteilung noch größer sein während sich bei zunehmender Größe der Stichprobenmenge die empirische Verteilung der idealen annähert. Alle Fälle sind aber dennoch zufällig. Es kommt lediglich auf den Freiheitsgrad an (bei 1-dimensionalen Mengen = n-1).
    Um zu beurteilen zu können ob die Stichproben zufällig verteilt sind reicht es nicht sich optisch anzuschauen ob es Ausreißer nach oben oder unten gibt sondern man muss die Abweichung zur Idealverteilung im Zusammenhang mit dem jeweiligen Freiheitsgrad betrachten - das wäre objektiv.
    Genau das macht der Chi²-Test. Bei kleiner Stichprobenmenge sind dort die zulässigen mittleren normierten Abweichungen zur Idealverteilung größer als bei einer größeren Stichprobenmenge.
    Eine Verteilung ist nicht unbedingt "nicht zufällig" nur weil sie für den Betrachter nicht so aussieht.

  • Das stimmt schon.
    Wiederkehrende Muster deuten auf nichtzufällige Einflüsse hin und bekanntermaßen kann man mit Computern nur quasi-zufällige Zahlen erzeugen.
    Nur in diesem Beispiel ist es so das die Tatsache allein das es den Rand erreicht noch kein Hinweis auf nichtzufällige Verteilung ist.

  • Zitat

    Nur in diesem Beispiel ist es so das die Tatsache allein das es den Rand erreicht noch kein Hinweis auf nichtzufällige Verteilung ist.

    Richtig, daher die Frage wie groß die GUI sein müsste, damit der Rand nicht erreicht wird....
    Oder wird "irgendwann" immer der Rand erreicht? Was natürlich die Frage aufwirft, wieso gerade DIESER Rand erreicht wurde und nicht einer der 3 anderen :pinch:

  • Ich hoffe, ich konnte dem hier einigermaßen folgen: Du schließt mehr oder weniger daraus, dass irgendwann ein Rand erreicht wird (was eigentlich im Unendlichen bei jeder Gui-Größe sein müsste) das es sich nicht um einen "echten" Zufall handelt?

  • bei 1000x1000 läuft´s schon länger....
    Wenn der Rand erreicht wurde, startet das Script wieder in der Mitte.....

    Spoiler anzeigen
    [autoit]


    #include <gdiplus.au3>

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

    _GDIPlus_Startup()
    $width = 1000
    $height = 1000

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

    $hgui = GUICreate("Random Viewer", $width, $height)
    GUISetState()
    $hGraphic = _GDIPlus_GraphicsCreateFromHWND($hgui)
    $hPen = _GDIPlus_PenCreate()

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

    ;~ Dim $a[$width + 2]
    ;~ $max = 0
    ;~ While $a[$max] < $height
    ;~ $random = Random(1, $width, 1)
    ;~ _GDIPlus_GraphicsDrawLine($hGraphic, $random, $a[$random], $random, $a[$random] + 1, $hPen)
    ;~ $a[$random] += 1
    ;~ If $a[$random] > $max Then $max = $random
    ;~ WEnd

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

    ;~ MsgBox(0, "häufigste Zahl zwischen 1 und " & $width, $max)

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

    _GDIPlus_GraphicsClear($hGraphic)
    $anz=0
    While $anz<>100
    $anz+=1
    $x = Int($width / 2) ;startpunkt mitte
    $y = Int($height / 2)
    Do
    $random = Random(1, 4, 1)
    Switch $random
    Case 1 ;rechts
    $x += 1
    $col = 0xFF0000FF
    Case 2 ;links
    $x -= 1
    $col = 0xFF00FF00
    Case 3 ;oben
    $y -= 1
    $col = 0xFFFF0000
    Case 4 ;unten
    $y += 1
    $col = 0xFF000000
    EndSwitch
    $hPen = _GDIPlus_PenCreate($col)
    _GDIPlus_GraphicsDrawLine($hGraphic, $x, $y, $x, $y + 1, $hPen)
    Until $x < 0 Or $x > $width Or $y < 0 Or $y > $height ;ende, wenn rand erreicht
    WEnd
    MsgBox(0, "", "Ende")

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit]
  • Zitat

    Du schließt mehr oder weniger daraus, dass irgendwann ein Rand erreicht wird (was eigentlich im Unendlichen bei jeder Gui-Größe sein müsste) das es sich nicht um einen "echten" Zufall handelt?

    Genau DAS ist das Problem^^
    Die Wahrscheinlichkeit, daß selbst bei unendlicher GUI-Größe der Rand erreicht wird, ist genauso groß wie die Wahrscheinlichkeit, daß bei einer GUI-Größe von 10x10 Pixeln der Rand NICHT erreicht wird!

  • Interessant wäre zu sehen was passiert, wenn man echte Zufallszahlen nimmt.

    random.org bietet ja die Möglichkeit, also hab ich mal LiveHTTP Headers angeschmissen und mir die Packets angeschaut, raus kam das:

    BinaryToString(InetRead("http://www.random.org/integers/?num=1&min=1&max=4&col=1&base=10&format=plain&rnd=new"))

    einfach dein Random damit ersetzen und man bekommt eine echte zufällige Zahl.
    Der Nachteil ist halt, dass es lange dauert...

    €: Hab grad gemerkt, dass man num=1 auch auf num=10000 ändern kann und somit 10000 Zahlen auf einmal bekommt!

  • Richtig, daher die Frage wie groß die GUI sein müsste, damit der Rand nicht erreicht wird....

    Geht bei jeder.
    Die nötige Anzahl an Durchgängen um irgendwann auf die äußeren Pixel zu kommen steigt bloß extrem mit dem Abstand zum Startpunkt.
    Prinzipiell aber immer möglich - nur halt mehr Durchgänge nötig. Wie du schon gesagt hast.

    wieso gerade DIESER Rand erreicht wurde und nicht einer der 3 anderen


    Lass es doch mal weiterlaufen und wenn dann nach ungefähr der doppelten Zeit wieder die Mitte erreicht wird hast du die selbe Anzahl an Links und Rechtsschritte - Gleichverteilung.
    Wenn du dann noch weiterlaufen lässt und die andere Seite erreicht wird und wieder zurückgeht ist es dann immer noch gleichverteilt.
    Ob du das Bild nun malst oder einfach nur die Anzahl der Vorkommen von Rechts-und-Links-Schritten vergleichst ist da egal wenn du das auf Zufälligkeit hin untersuchen willst.

    Einmal editiert, zuletzt von AspirinJunkie (23. Juli 2011 um 14:35)

  • Zitat

    Ob du das Bild nun malst oder einfach nur die Anzahl der Vorkommen von Rechts-und-Links-Schritten vergleichst ist da egal wenn du das auf Zufälligkeit hin untersuchen willst.

    richtig, und weitergedacht kommt man auf so etwas: http://www.pixelmonkeys.org/

  • Ohne Backbuffer geht bei mir garnix xD
    Mein Win bekommt dann immer den Rappel und aktualisiert alle fenster, wodurch immer alles verschwindet was schon drauf ist.

    Hier schonmal vorab (ich hab das Thema grade erst gefunden) etwas zur Analyse:

    Spoiler anzeigen
    [autoit]

    #include <gdiplus.au3>

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

    _GDIPlus_Startup()

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

    Global Const $Size = 100
    Global Const $Versuche = 20

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

    Global $width = $Size
    Global $height = $Size
    Global $hgui = GUICreate("Random Viewer", $width, $height)
    GUISetState(@SW_SHOW, $hgui)
    Global $hGraphic = _GDIPlus_GraphicsCreateFromHWND($hgui)
    Global $hBitmap = _GDIPlus_BitmapCreateFromGraphics($width, $height, $hGraphic)
    Global $hBackbuffer = _GDIPlus_ImageGetGraphicsContext($hBitmap)
    Global $hPen = _GDIPlus_PenCreate(), $x, $y

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

    AdlibRegister('ReDraw', 25)
    GUIRegisterMsg(0xF, 'ReDraw')

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

    Local $t = TimerInit()
    Local $Schritte = _Testreihe($Versuche)
    $t = TimerDiff($t)

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

    MsgBox(0, 'Ende', 'Durchschnitt: ' & $Schritte[0] & @CRLF & 'Mindestens: ' & $Schritte[1] & @CRLF & 'Maximal: ' & $Schritte[2] & @CRLF & 'Schitte/ms: ' & Round(($Schritte[0] / $t) * $Versuche, 1))

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

    AdlibUnRegister('ReDraw')
    GUIRegisterMsg(0xF, '')
    _GDIPlus_PenDispose($hPen)
    _GDIPlus_GraphicsDispose($hBackbuffer)
    _GDIPlus_BitmapDispose($hBitmap)
    _GDIPlus_GraphicsDispose($hGraphic)

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

    Func ReDraw()
    _GDIPlus_GraphicsDrawImage($hGraphic, $hBitmap, 0, 0)
    EndFunc

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

    Func _Testreihe($max)
    Local $Zeit = 0, $minimal, $maximal, $tmp
    For $i = 1 To $max Step 1
    _GDIPlus_GraphicsClear($hBackbuffer, 0xFF000000)
    $x = Int($width / 2) ;startpunkt mitte
    $y = Int($height / 2)
    $tmp = _RandErreichen()
    $Zeit += $tmp
    If Not $minimal Or $tmp < $minimal Then $minimal = $tmp
    If Not $maximal Or $tmp > $maximal Then $maximal = $tmp
    Next
    Local $a[3] = [$Zeit / $max, $minimal, $maximal]
    Return $a
    EndFunc

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

    Func _RandErreichen()
    Local $timer = 0, $random
    Do
    $random = Random(1, 4, 1)
    Switch $random
    Case 1 ;rechts
    $x += 1
    $col = 0xFF0000FF
    Case 2 ;links
    $x -= 1
    $col = 0xFF00FF00
    Case 3 ;oben
    $y -= 1
    $col = 0xFFFF0000
    Case 4 ;unten
    $y += 1
    $col = 0xFF000000
    EndSwitch
    _GDIPlus_PenSetColor($hPen, $col)
    _GDIPlus_GraphicsDrawLine($hBackbuffer, $x, $y, $x, $y + 1, $hPen)
    $timer += 1
    Until $x < 0 Or $x > $width Or $y < 0 Or $y > $height ;ende, wenn rand erreicht
    Return $timer
    EndFunc

    [/autoit]

    Es fehlt das Skript, welches die Fenstergröße von 10x10 ausgehend bis 500x500 vergrößert (in sinnvollen Schrittlängen) und jedesmal eine hohe Anzahl versuche durchzieht.
    Dann lässt sich eine Funktion für die Durchschnittliche Dauer im Vergleich zur Größe aus den Ergebnissen rekonstruieren und damit Andys Frage beantworten !

    lg
    Mars(i)

  • Hi,
    wie AspirinJunkie schon erklärt hatte, bestehen natürlich mathematische Grundlagen (Stochastik) im Zusammenhang mit der "Zufallszahlen"-Spielerei.

    Im Endeffekt ist es einfach:
    Erzeuge n "zufällige" Zahlen und verifiziere mit diversen Verfahren, ob die Verteilung auch wirklich zufällig sein könnte.
    In einem bestimmten Bereich (chi² wurde angesprochen) sind Abweichungen als normal (bzw. systemimmanent) zu betrachten.

    Für den vorliegenden Fall der grafischen Spielerei sieht das so aus, daß nach etlichen aufeinanderfolgenden Versuchen irgendwann der Fall eintritt, daß der "Pixelgänger" vom Mittelpunkt der GUI auf einer geraden Linie zum Rand läuft...mathematisch kein Thema, denn dieser Fall muss von einem "echten" Zufallszahlenalgorithmus natürlich auch vorgesehen werden.
    Wenn dieser Fall nach den (berechneten) 12^345 Versuchen 3x nacheinander auftritt, dann sind die Mathematiker natürlich stolz! Wenn dieser Fall allerdings nach dem 2. Versuch auftritt, dann stellt wohl jeder die "Zufälligkeit" in Frage ;)

    Anders gesagt, "Zufall" wird nur dort als solcher akzeptiert, wo Chaos erwartet wird.
    Wären bei den ersten Ziehungen der Lottozahlen an 3 Samstagen nacheinander die Zahlen 1,2,3,4,5,6 gezogen worden, hätte es mit Sicherheit einige böse Verwicklungen gegeben, und niemand würde heute Kreuzchen in kleine Kästchen machen....und kein Richter und Staatsanwalt hätte die "Wahrscheinlichkeit" für diesen Fall akzeptiert!

  • hier wie versprochen das Skript mit vollständiger Auswertung

    Spoiler anzeigen
    [autoit]


    #include <GDIPlus.au3>
    #include <Array.au3>

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

    Opt('GUICloseOnESC', 0)
    Opt('GUIOnEventMode', 1)
    Opt('MustDeclareVars', 1)

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

    _GDIPlus_Startup()

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

    Global $h_GDI32_DLL = DllOpen('gdi32.dll')

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

    Global $hGUI = GUICreate('PixelText', 500, 500, @DesktopWidth/2 - 250, @DesktopHeight/2 - 250, 0x80000000, 0x80000)

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

    GUISetState(@SW_SHOW, $hGUI)
    WinSetTrans($hGUI, '', 255)
    GUISetOnEvent(-3, '_Exit', $hGUI)

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

    Global $hDC_GUI = _WinAPI_GetDC($hGUI)
    Global $hImg_Backbuffer = _CreateImage(500,500)

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

    GUIRegisterMsg(0xF, 'WM_PAINT')
    GUIRegisterMsg(0x84, 'WM_NCHITTEST') ; Um das Fenster bewegen zu können
    AdlibRegister('WM_PAINT', 25)
    OnAutoItExitRegister('_Exit')

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

    Sleep(2000)

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

    Local $a = _Testreihe()
    _ArrayDisplay($a)

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

    While Sleep(100)
    WEnd

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

    Func _Testreihe()

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

    Local $Versuche, $Min, $Max, $Ges, $Tmp, $Array[101][3]

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

    For $Size = 10 To 20 Step 1

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

    $Versuche = Int(1500/$Size)
    $Min = False
    $Max = False
    $Ges = 0
    $Tmp = 0

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

    For $i = 1 To $Versuche Step 1

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

    ToolTip('Size: ' & $Size & @CRLF & 'Versuch: ' & $i & '/' & $Versuche)

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

    $Tmp = _RandErreichen($Size)
    $Ges += $Tmp
    If Not $Min Or $Tmp < $Min Then $Min = $Tmp
    If Not $Max Or $Tmp > $Max Then $Max = $Tmp

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

    Next

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

    $Array[$Size][0] = Int($Ges/$Versuche)
    $Array[$Size][2] = $Max
    $Array[$Size][1] = $Min

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

    #cs ; An eine Beliebige Stelle in Excel Klicken und laufen lassen
    Send(Int($Ges/$Versuche), 1)
    Send('{RIGHT}')
    Send($Min, 1)
    Send('{RIGHT}')
    Send($Max, 1)
    Send('{ENTER}')
    Send('{LEFT}')
    Send('{LEFT}')
    #ce

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

    Next

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

    $Array[0][0] = 'Durchschnitt'
    $Array[0][2] = 'Maximalwert'
    $Array[0][1] = 'Minimalwert'

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

    Return $Array

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

    EndFunc

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

    Func _RandErreichen($Size)

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

    Local $Img = _CreateImage($Size, $Size)
    Local $x = Int($Size/2), $y = Int($Size/2)
    Local $Schritte = 0
    Local $random = 0
    Local $Zeichnen = Int($Size/10)
    Local $struct = DllStructCreate('int['&$Size^2&']', DllStructGetData($Img, 1, 4))

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

    Do
    Switch Random(1, 4, 1)
    Case 1 ;rechts
    $x += 1
    DllStructSetData($struct, 1, 0xFF0000FF, $x + $y * $Size)
    Case 2 ;links
    $x -= 1
    DllStructSetData($struct, 1, 0xFF00FF00, $x + $y * $Size)
    Case 3 ;oben
    $y -= 1
    DllStructSetData($struct, 1, 0xFFFF0000, $x + $y * $Size)
    Case 4 ;unten
    $y += 1
    DllStructSetData($struct, 1, 0xFF000000, $x + $y * $Size)
    EndSwitch

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

    $Schritte += 1

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

    If IsInt($Schritte/$Zeichnen) Then DllCall($h_GDI32_DLL, 'int', 'StretchBlt', 'hwnd', DllStructGetData($hImg_Backbuffer, 1, 1), 'int', 0, 'int', 0, 'int', 500, 'int', 500, 'hwnd', DllStructGetData($Img, 1, 1), 'int',0, 'int', 0, 'int', $Size, 'int', $Size, 'dword', 0xCC0020)

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

    Until $x < 0 Or $x > $Size Or $y < 0 Or $y > $Size

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

    _DeleteImage($Img)

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

    Return $Schritte

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

    EndFunc

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

    Func WM_NCHITTEST($hWnd, $Msg, $wParam, $lParam)
    If ($hWnd = $hGUI) And ($Msg = 0x84) Then Return 2
    EndFunc ;==>WM_NCHITTEST

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

    Func WM_PAINT()
    _DrawImage($hDC_GUI, 0, 0, $hImg_Backbuffer)
    EndFunc

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

    Func _Exit()
    ConsoleWrite('Wird Beendet' & @CRLF)
    AdlibUnRegister('WM_PAINT')
    GUIRegisterMsg(0xF, '')
    _DeleteImage($hImg_Backbuffer)
    _WinAPI_DeleteDC($hDC_GUI)
    DllClose($h_GDI32_DLL)
    _GDIPlus_Shutdown()
    Exit
    EndFunc

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

    Func _DrawImage($hDC, $x, $y, $struct)
    _WinAPI_BitBlt($hDC, $x, $y, DllStructGetData($struct, 1, 2), DllStructGetData($struct, 1, 3), DllStructGetData($struct, 1, 1), 0, 0, 0xCC0020)
    EndFunc ;==>_DrawImage

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

    Func _CreateImage($b, $h)
    Local $ptr, $hDC, $hbmp
    $hDC = _CreateNewBmp32($b, $h, $ptr, $hbmp)
    Local $struct = DllStructCreate('int[5]')
    DllStructSetData($struct, 1, $hDC, 1)
    DllStructSetData($struct, 1, $b, 2)
    DllStructSetData($struct, 1, $h, 3)
    DllStructSetData($struct, 1, $ptr, 4)
    DllStructSetData($struct, 1, $hbmp, 5)
    Return $struct
    EndFunc ;==>_CreateImage

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

    Func _DeleteImage(ByRef $struct)
    _WinAPI_DeleteObject(DllStructGetData($struct, 1, 5))
    _WinAPI_DeleteDC(DllStructGetData($struct, 1, 1))
    $struct = 0
    EndFunc ;==>_DeleteImage

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

    Func _CreateNewBmp32($iWidth, $iHeight, ByRef $ptr, ByRef $hbmp) ;erstellt leere 32-bit-Bitmap; Rückgabe DC und ptr und handle auf die Bitmapdaten
    Local $hcdc = _WinAPI_CreateCompatibleDC(0) ;Desktop-Kompatiblen DeviceContext erstellen lassen
    Local $tBMI = DllStructCreate($tagBITMAPINFO) ;Struktur der Bitmapinfo erstellen und Daten eintragen
    DllStructSetData($tBMI, "Size", DllStructGetSize($tBMI) - 4);Structgröße abzüglich der Daten für die Palette
    DllStructSetData($tBMI, "Width", $iWidth)
    DllStructSetData($tBMI, "Height", -$iHeight) ;minus =standard = bottomup
    DllStructSetData($tBMI, "Planes", 1)
    DllStructSetData($tBMI, "BitCount", 32) ;32 Bit = 4 Bytes => AABBGGRR
    Local $adib = DllCall($h_GDI32_DLL, 'ptr', 'CreateDIBSection', 'hwnd', 0, 'ptr', DllStructGetPtr($tBMI), 'uint', 0, 'ptr*', 0, 'ptr', 0, 'uint', 0)
    $hbmp = $adib[0] ;hbitmap handle auf die Bitmap, auch per GDI+ zu verwenden
    $ptr = $adib[4] ;pointer auf den Anfang der Bitmapdaten, vom Assembler verwendet
    _WinAPI_SelectObject($hcdc, $hbmp) ;objekt hbitmap in DC
    Return $hcdc ;DC der Bitmap zurückgeben
    EndFunc ;==>_CreateNewBmp32

    [/autoit]

    Wenn jemand Excel hat kann er auch schnell nach dem Start (dafür sind die 2sek wartezeit) in die Mappe klicken und die Ergebnisse werden automatisch eingetragen. (Dann empfiehlt es sich aber die Grafischen Sachen auszukommentieren. Dann gehts bedeutend schneller)

    Heraus kommt dann sowas in der Art.

    [Blockierte Grafik: http://i.imgur.com/mr9yW.png]

    x-Achse: Breite und Höhe
    y-Achse: Schritte bis zu einem Rand

    Da lässt sich das Verhalten doch schon gut sehen !

    lg
    Mars(i)

  • Bei aktuellen Computern stimmt die Aussage, dass Zufall != Zufall ist. Bei der zukünftigen Generation der auf Quantenphysik aufbauenten Rechner aber nichtmehr.

    Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.