.+++++. .--. .--. .--.--.--. | ~~~~~ | .oO( Programmieren, Ich? ) ) '*_*' ( `-----' `------' `--' ( ._. ) '.._..' Workshop/Vortrag von _,/\ /\,_ Andreas Romeyke (romeyke@cbs.mpg.de) / ':' \ Spielen ist Experimentieren mit dem Zufall, Novalis (aus "Fragmente") * Pseudozufallszahlen * Zufallsstimuli in Presentation * Zufallsverteilung * Randbedingungen und Zufallsziehung zum Inhalt --> [j] Pseudozufall ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Computer können keine echten Zufallszahlen erzeugen, nur rechnen. Pseudozufallszahlen sind eben nicht zufällig! Häufig verwendet: Linearer Kongruenzgenerator: Y = ( A * Y + B ) % M i i-1 Merkmale eines guten Pseudozufallszahlengenerators: * Unabhängigkeit aufeinanderfolgender Zahlen * Entsprechen gewünschter Verteilung * sind nicht periodisch Testen eines Pseudozufallszahlengenerators ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Einfachster Test: Histogram .--------------------------- | for i=0 to trials | r=rand(histsize); | hist[r]++; | done | for i=0 to histsize | print i; | for j=0 to (hist[i]*40/trials | print "#"; | done | print "\n"; | done `--------------------------- (pseudocode) Reicht das? Recurrence Plot ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Trage Vorgänger auf x-Achse, Nachfolger auf y-Achse ein: .--------------------------- | x=rand(histsize); | for i=1 to trials | y=rand(histsize); | point[x,y]++; | x=y; | done | for x=0 to histsize | for y=0 to histsize | plot_point x, y, point[x,y]; | done | done `--------------------------- (pseudocode) Zufallsverteilung ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * Gleichverteilung - konstante Wahrscheinlichkeitsdichte, jedes Ereignis tritt gleich oft auf * sonstige (hier nicht weiter betrachtet) - Bernoulli, von n-binären Ereignissen, wieviele k erfolgreich - Exponentialverteilung, zB. Wieviele Baulemente fallen nach n-Jahren der Nutzung aus? - Poissonverteilung, gibt an, dass in einem gegebenen Zeitraum n Ereignisse stattfinden Zufallsstimuli in Presentation ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Fall 1: einfaches Array .--------------------------- | .. [ in SDL ] .. | array { | bitmap { .. } bitmapname1; | bitmap { .. } bitmapname2; | .. | bitmap { .. } bitmapnameN; | } zufBitmap; | .. [ in PCL ] .. | zufBitmap.shuffle(); `--------------------------- Rückblick mehrdimensionale Array ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +-------------------+ ^ | |___| |___| |___| | Fach 3 | +-------------------+ | | |___| |___| |___| | Fach 2 | +-------------------+ | | |___| |___| |___| | Fach 1 | +-------------------+ | Kiste Kiste Kiste Fachnummer links mitte rechts --------------------> Kistenummer Rückblick mehrdimensionale Array ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +-------------------+ ^ In der Programmierwelt gilt: | |___| |___| |___| | Fach 3 | +-------------------+ | Ein Regal kann nur Dinge gleichen | |___| |___| |___| | Fach 2 | Typs enthalten. Ein Aktenregal ent- +-------------------+ | hält nur Akten, ein Bücherregal nur | |___| |___| |___| | Fach 1 | Bücher, ein Integer-"Regal" Integer, +-------------------+ | ein String-"Regal" nur Zeichenketten, ein Bitmap-Arrays nur Bitmaps! Kiste Kiste Kiste Fachnummer links mitte rechts --------------------> Kistenummer Zufallsstimuli in Presentation (... Fortsetzung) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Fall 2: mehrdimensionale Arrays +---+------+ |IDX| VALUE| +---+------+ +---+------+ +---+------+ | | 1 | o--------------|IDX| VALUE| + | 2 | o-----------> +---+------+ | | . | . | +---+------+ az | | . | . | . | |IDX| VALUE| la | | ; | N | o------> +---+------+ ls |-+ / Shuffle +---+------+ | 1 | foo |----+ /> über | 2 | bar | / Subarrays . , | 3 | baz | .' ( ~ Kistennummer) '._______- +---+------+ \/ Shuffle des Hauptarrays ( ~ Fachnummer ) .--------------------------- | array AR[10][6]; | [..] | AR.shuffle(); /* Shuffling Hauptarray */ | [..] | loop /* für jedes "Fach" */ | int i=0 | until | i>=AR.count(); | begin | /* mische die "Kisten" */ | AR[i].shuffle; /* Shuffling des i-ten Subarrays */ | i=i+1; | end; `--------------------------- Bedingtes Verwürfeln ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Beispiel: Annerose Engel: "Ich habe ein 3 x 2 Faktorielles Design: drei verschiedene Arten von Stimuli (A, B, C) die entweder mit richtig oder falsch (JA oder Nein) beantwortet werden können. Meine Restriktionen für die Randomisierung sind: 1. ein Art von Stimulus sollte nicht nacheinander auftreten (also kein A nach A). 2. es sollten nicht mehr als drei Ja oder Nein Antworten hintereinander Stücke auftreten, unabhängig von der Stimulusart. Erschwerend kommt hinzu, das es von Kategorie A mehr Elemente gibt (nämlich 30) als von B und C (je 18 Elemente). Was sind endliche Automaten? ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Beispiel Ampel: ((Start)) -> ( rot ) -> ( rot-gelb ) -> ( grün ) -> ( gelb ) . ^ | . | | . \____________________________________/ . . Startzustand U"bergänge aktueller Zustand, nächster Zustand Lösung mit endlichen Automaten ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Gegeben: 3 Zustände, A B und C ((START)) -> (A) -> (B) -> (C) ^ | | ^ ^ | | | | | | | \|___/ \___|/ | | \__________/ Du wählst jeden der U"bergänge zufällig aus: A->B oder B->C oder C->A A->C B->A C->B A(ja1) ->B(ja2) ->C(ja2) ->B(nein1) ->C(nein1) A(ja2) ->B(ja3) ->C(ja3) ->B(nein1) ->C(nein1) A(ja3) ->B(nein1) ->C(nein1) B(ja1) ->... .. C(ja3) ->... A(nein1) -> B(ja1) .. usw. usf. Darstellung als Tabelle, hier Ampel ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | Folgezustand | -+-----+-----+-----+-----+-----+ Zustandsautomat (FSM) I| | rot | r/g | grn | glb | der Ampel s|-----+-----+-----+-----+-----+ t| rot | nö | ja | nö | nö | z|-----+-----+-----+-----+-----+ ,-> ( r/g ) -> ( grn ) >-, u| r/g | nö | nö | ja | nö | / \ s|-----+-----+-----+-----+-----+ | | t| grn | nö | nö | nö | ja | ( rot ) <---(( START )) ( glb ) a|-----+-----+-----+-----+-----+ ^ | n| glb | ja | nö | nö | nö | \ / d|-----+-----+-----+-----+-----+ '---<-------<-------<---' Darstellung als Tabelle ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | Folgezustand | -+-----+-----+-----+-----+-----+-----+-----+-----+-..-+-----+ I| | Ay1 | Ay2 | Ay3 | An1 | An2 | An3 | By1 | | Cn3 | s|-----+-----+-----+-----+-----+-----+-----+-----+-..-+-----+ t| Ay1 | | | | | | | | | | z|-----+-----+-----+-----+-----+-----+-----+-----+-..-+-----+ u| Ay2 | | | | | | | | | | s|-----+-----+-----+-----+-----+-----+-----+-----+-..-+-----+ t| Ay3 | | | | | | | | | | a|-----+-----+-----+-----+-----+-----+-----+-----+-..-+-----+ n| An1 | | | | | | | X | | | d|-----+-----+-----+-----+-----+-----+-----+-----+-..-+-----+ : ... : : : : : : : : : : |-----+-----+-----+-----+-----+-----+-----+-----+-..-+-----+ | Cn3 | | | | | | | X | | | -+-----+-----+-----+-----+-----+-----+-----+-----+-..-+-----+ Endlicher Automat in Presentation ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .--------------------------- | bool fsm[2] = { }, /* TODO */ | [..] | sub int next_state (int actual_state) | begin | int next_state=0; | loop | bool next_state_is_possible=false | until | begin | /* wähle zufälligen nächsten Zustand */ | next_state = rand(fsm.count()); | next_state_is_possible=fsm[actual_state][next_state]; | end; | return next_state; /* liefere nächsten möglichen Zustand aus */ `--------------------------- Kodierung der Zustände im Urnenmodell ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Eine Urne enthält n-Kugeln... ... Auf der Kugel sind die einzelnen Eigenschaften kodiert, zum Beispiel: farbe=rot, ziffer=1, muster=dreieck Die Kugeln werden in der Urne gemischt. Wenn eine Kugel gezogen wird, werden die Eigenschaften dekodiert. Die Kugel wird weggelegt (Ziehen ohne Zurücklegen) Kodierung der Zustände im simulierten Urnenmodell ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Die Kodierung erfolgt in einem Eigenschaftsarray... ... oder in einem Array mit verschiedenen Stimuli .--------------------------- | /* array der Dimension n*3, | Spalte 1 enthaelt farbe, | Spalte 2 enthaelt ziffer, | Spalte 3 enthält muster*/ | array < int > arrayOfActionVariants[0][3]; | int rot=3; | int gelb=4; | .. | sub add_code | begin | array tmp[3]; | tmp[1]=rot; tmp[2]=1; tmp[3]=dreieck; | arrayOfActionVariants.add( tmp ); | end `--------------------------- Kodierung der Zustände im simulierten Urnenmodell (Fortsetzung...) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Der Index des Arrays entspricht dabei dem zugeordneten Zustand. .--------------------------- | .. | arrayOfActionVariants.shuffle(); | .. | loop /* Hole aktuelle Kugel */ | int kugel=1 | until | kugel>wieoftziehen | begin | int farbe; int ziffer; int muster; | /* Spalte 1 -> farbe, Spalte 2 -> ziffer, Spalte 3 -> muster*/ | farbe= arrayOfActionVariants[kugel][1]; | ziffer=arrayOfActionVariants[kugel][2]; | muster=arrayOfActionVariants[kugel][3]; | .. | kugel=kugel+1; | end; `--------------------------- Vergleiche das Urnenmodell... (Zurücklegen Kugeln auch möglich) Alternative, Arbeit mit Conan und CSV-Dateien ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Vorbereitung ... .--------------------------- | /* returns an array with 5 conditionfactors read from file filename */ | sub array read_cond_list (string filename) | begin | array conditions[0][5]; array tmp[5]; | input_file cond_file = new input_file; cond_file.open(filename); | int c=1; | /* to be continued ... */ `--------------------------- Alternative, Arbeit mit Conan und CSV-Dateien ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ... Leseschleife .--------------------------- | | loop until | cond_file.end_of_file() || !cond_file.last_succeeded() | begin | string line = cond_file.get_string(); | if (1 != c && 0 != line.count()) then /* ignore header */ | line.split(",", tmp);/* type, task, person, personcue, stimulus, response */ | conditions.add(tmp); | end; | t_loading.present(); c=c+1; | end; | /* to be continued ... */ `--------------------------- Alternative, Arbeit mit Conan und CSV-Dateien ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ... Fehlerbehandlung und Rückgabe .--------------------------- | if !cond_file.last_succeeded() && !cond_file.end_of_file() then | term.print ("Error while reading condition list '" + filename + "'\n"); | end; | return conditions; | end; `--------------------------- Was bevorzugen? ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Welches Verfahren? Es kommt darauf an... - der schlechte Ansatz Conan: Solange draufhauen bis es (Randbedingung) passt - der gute Ansatz Redsonja: Alle erlaubten Kombinationen bilden, eine davon ziehen Du: über Zustandssimulation Redsonja ist unterwegs... Mehr... ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * Presentation Hilfe * Presentationportal im Wiki: https://cbswiki/EDV/FuerUser/PresentationPortal * Conan: https://cbswiki.cbs.mpg.de/bin/view/EDV/FuerUser/CoNan * Varna: http://andreas-romeyke.de/barbarian_tools/ * Rando: http://sourceforge.net/projects/rando/ Fertig! ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Wenn Fragen oder Rückmeldungen ... Mail an mich: romeyke@cbs.mpg.de