Xte Schere, Sttein Papier Variante

Code-Stücke können hier veröffentlicht werden.
Benutzeravatar
wwwheimer
User
Beiträge: 25
Registriert: Sonntag 17. Juli 2011, 16:35

Aber vielleicht helfen doch ein paar Ausgaben weiter:

Code: Alles auswählen

>>> 
>>> from asim import start as s
>>> s(1)
Aset: bca , Awin: 0
Bset: bcb , Bwin: 1
weightA: 1 , 1 , 1
weightB: 0 , 2 , 1
>>> s(7)
Aset: bccccabbacbcabcaacabb , Awin: 6
Bset: abbaacccabccbbcabbabc , Bwin: 8
weightA: 6 , 7 , 8
weightB: 6 , 8 , 7
>>> s(12)
Aset: bbaabcbcbabaacbbcaacaaaaabcbaabcabbb , Awin: 16
Bset: cccbcbaabcabccbaccabcaabbcaaccaccbab , Bwin: 10
weightA: 15 , 14 , 7
weightB: 11 , 10 , 15
>>> s(1000)
Aset: aaabccaababcbabbcbbcb..............# 2 * 3000! B hat gewonnen ;-)
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

wwwheimer hat geschrieben: da weiss ich im Moment auch nicht wie ich es noch anders erklären könnte. Vielleicht später.
Tja, ich denke mal, dann wirst Du von uns hier erst wieder etwas hören, wenn Du uns Code vorlegst ;-)
wwwheimer hat geschrieben: Bin selbst gespannt, wie ich das löse. Denn mehr Treffer sind nur ein Kriterium für Erfolg. Das andere Kriterium ist das Gewicht (Ordnungszahl), das auch stimmen muss. Für eine Sortierung nach Unter-, Ideal- und Über-Gewicht braucht es, was ich oben mit 'Speicherwerk' umschreibe. Welche tollen Objekte/Methoden mir Python hier wohl bietet?
Ich kann Dir leider überhaupt nicht mehr folgen. Wenn Du die Strategie und den Ablauf nicht irgend wie besser erklären kannst, ist es mit Tipps hier schwer :-)

Es fängt schon dabei an, dass mir immer noch nicht klar ist, was Du unter erfolgreichen Schlangen verstehst (was ist hier das Maß?) und inwiefern diese mit Deinen "Ordnungszahlen" in Zusammenhang stehen.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
wwwheimer
User
Beiträge: 25
Registriert: Sonntag 17. Juli 2011, 16:35

Hyperion, Treffer und Gewicht definieren zusammen die Kategorie 'Erfolg'.
Eine abcSchlange kann auch überdurchschnittliche Treffer erzielen, wenn sie zB. auf 'a' starkes Untergewicht hat, was als Ordnungszahl dann in etwa so aussieht: 6,12,12. Die hat zwar zufällig gut gewonnen, aber hat bei mehreren Durchläufen schlechte Chancen, weil da die fehlenden 'a' sich bemerkbar machen.
Sie wird deshalb unter der Kategorie der aUntergewichtigen abgelegt.
Dann gibt es natürlich auch eine Kategorie für aÜbergewichtige. So kann man dann eine aUntergewichtige mit einer aÜbergewichtigen kombinieren und bekommt eine Idealgewichtige.;-)
Als Ordnungszahlen:
6, 12, 12. = aUnterg.
plus
14, 8, 8. = aÜberg.
ergibt
20, 20, 20 = Idealg.
Das sollte nun wirklich leicht zu verstehen sein.
yipyip
User
Beiträge: 418
Registriert: Samstag 12. Juli 2008, 01:18

Mir gehts wie Hyperion. Warum muessen die Sequenzen durch 3 teilbar sein? Man hat zwar 3 Gegenstaende, das hat aber erstmal nichts mit der Laenge der gespielten Sequenzen/Runden zu tun. Die Analyse auf Basis von 3er Tupeln innerhalb einer Sequenz halte ich erstmal nicht fuer so sinnvoll. Die Namen a, b, c erleichtern auch nicht gerade die Interpretation der Ausgabe. Da finde ich r, p, s (fuer (R)ock, (P)aper, (S)cissor)) eingaengiger, oder "o", "-", "<" :-), oder auschreiben...

Mein erstes Beispiel kann man natuerlich auch dahingegend erweitern, darueber Buch zu fuehren, wer was gespielt hat. Da ich vermute, das du es anders geloest hast, hier nochmal meine Version: (Da ich geistig und installationsmaeesig noch bei 2.6 bin, ohne collections.Counter)
http://paste.pocoo.org/show/458640/

Zunaechst einmal wuerde ich mir ein Programmgeruest bauen, mit dem ich mir unterschiedliche Playerstrategien definieren kann, die dann gegeneinander antreten. Diese koennen auch vollkommen trivial sein, z.B. Player spielt nur "Rock" oder das, was der Gegner zuletzt gespielt hat. Danach kann man diese dann immer mehr verfeinern. Oh, sehe gerade, ich bin nicht mehr aktuell, mmh... tappe immer noch im Dunkeln, wie deine Strategie funktionieren soll.

:wink:
yipyip
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

wwwheimer hat geschrieben:Hyperion, Treffer und Gewicht definieren zusammen die Kategorie 'Erfolg'.
Und was sind `Treffer` und `Gewicht`? ;-)
wwwheimer hat geschrieben: Eine abcSchlange kann auch überdurchschnittliche Treffer erzielen, wenn sie zB. auf 'a' starkes Untergewicht hat, was als Ordnungszahl dann in etwa so aussieht: 6,12,12. Die hat zwar zufällig gut gewonnen, aber hat bei mehreren Durchläufen schlechte Chancen, weil da die fehlenden 'a' sich bemerkbar machen.
Ok, aber woher willst Du wissen, ob die nur zufällig gewonnen hat? Evtl. ist die Gegner KI ja anfällig dafür, bei vielen gespielten `a`s zu versagen. Damit wäre es eine gute Strategie auf `a` zu setzen! Oder aber, wenn das die Sequenz des Gegners ist, spielt er wenig a, daher wäre es dann wohl sinnvoll etwas zu spielen, was gegen `b` und `c` gewinnt!

Hinzu kommt noch: Du ignorierst die Reihenfolge. Evtl. ist eine Gegner-KI einfach alternierend. Damit spielt sie zwar in einer Laplace-Wahrscheinlichkeit, aber berechenbar. Wenn Du nun zufällig einen Wert dagegen setzt, gewinnt Deine KI sicherlich besser als ohne irgend eine Analyse.
wwwheimer hat geschrieben: ...
Das sollte nun wirklich leicht zu verstehen sein.
Ja. Aber was bringt das? Wie kommt es denn zu solchen "Schlangen"? Das habe ich schon vor zig Postings einmal gefragt ;-)

Wie werden daraus

Code: Alles auswählen

aaabbbcacbbaaabbbccccbaaabccc
eine oder mehrere "Schlangen"? Nach welchen Regeln wird da zerstückelt? Und mit welchem Ziel? (das kann natürlich auch implizit in den Regeln stehen - aber ich würde es doch gerne auch mal explizit hören)

Und was ist das Ziel Deiner Analyse? Du zerstückelst ein laufendes Spiel in Sequenzen (bei Dir Schlangen) und zählst darin das Auftreten der einzelnen Möglichkeiten. Dann gewichtest Du diese bezüglich der Laplace-Wahrscheinlichkeit. Und nun? Wie willst Du diese Erkenntnisse nutzen? Und wo liegt der Zusammenhang zwischen zwei Sequenzen? Wozu überhaupt mehrere Sequenzen? Wo liegt da der Vorteil gegenüber einer globalen Betrachtung der gesamten bisher gespielten Sequenz? Und vor allem: Welche Sequenz betrachtest Du überhaupt? Die des Gegners, um daraus Schlüsse zu ziehen, oder Deine eigene, um diese ausgeglichen zu gestalten bezüglich der Laplace-Wahrscheinlichkeit? Mir kommt es an diesem Punkt so vor, als vermischt Du das ein wenig. Insofern wäre es aus meiner Sicht sinnvoll, wenn Du Deine Idee einmal präzise global beschreibst!
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
wwwheimer
User
Beiträge: 25
Registriert: Sonntag 17. Juli 2011, 16:35

@yipyip,
Code lesen macht mehr Spass, als Löcher in Bauch gefragt bekommen :-) Danke!

Hyperion,
mit der Lapace-Wahrscheinlichkeit hatte ich anfangs fälschlich was anderes assoziiert.
Habe nachgeschaut.
Klar, das ist sozusagen die Richtschnur, an der sich Abweichungen nach oben wie nach
unten messen lassen. Praktisch braucht es also eine Zahl, die diese Wahrscheinlichkeit
repräsentiert. Und eben genau diese Zahl erhalte ich durch die Dreiergruppierung!
Die Zahl der Dreier repräsentiert die Laplace-Wahrscheinlichkeit. Womit ich in der Folge
diese LW nicht mehr extra berechnen muss. Und bei notwendigen Berechnungen lassen
sich Dezimalbrüche gut vermeiden - was wohl auch nicht ganz unwichtig ist.

Beispiel:
Um eine 30 Zeichen lange Sequenz zu erhalten, mussen 10 Dreier aneinandergehängt/erzeugt
werden. Die Zahl '10' steht für die jeweiligen Chancen dieser Sequenz 10 mal zu gewinnen,
10 mal zu verlieren und 10 mal unentschieden zu spielen. Erfolgreich ist eine Sequenz, wenn
sie mehr als 10 plus x Treffer erzielt hat.
Der Witz bei der Geschichte ist doch, dass in dem eigentlichen Spiel schon die Drittellung
vorgegeben ist und es darum auch Sinn macht die Regeln danach auszurichten.

Ich habe auch nicht, wie Du anzunehmen scheinst, eine andere KI, sondern allein die nackte
Random-Funktion zum 'Gegner'. Was Du andenkst ist eine andere 'Baustelle' und sehr
viel komplexer als ich bei diesem Beispiel im Sinne habe. Zu allererst will ich ja an einem
überschaubarem Projekt das Programmieren mit Python lernen, und nicht etwa ein tolles
KI-Script schreiben.
Die eigentliche Spiel-Funktion ist soweit klar. Da spielt es auch keine Rolle wie die Sequenzen
entstehen, weil die Zeichen der Funktion einzeln übergeben werden und sie auch
Einzelergebnisse liefert. Auch die Erzeugung der Sequenzen ist soweit klar. Hier noch einmal
beide Funktionen zusammen:

Code: Alles auswählen

import random
def sim(inp):
    a = inp
    if a == "a":
        a = 1
    if a == "b":
        a = 2
    if a == "c":
        a = 3
    aplay = 0; bplay = 0
    b = random.randint(1,3)
    if a == b:
        pass
    else:
        if a > b:
            z = a - b
            if z == 1:
                aplay = 1
            else:
                bplay = 1
        else:
            z = b - a
            if z == 1:
                bplay = 1
            else:
                aplay = 1
                
    if a == 1:  
        ap = 'a'
    if a == 2:
        ap = 'b'
    if a == 3:
        ap = 'c'
       
    if b == 1:
        bp = 'a'
    if b == 2:
        bp = 'b'
    if b == 3:
        bp = 'c'
        
    return aplay, ap, bplay, bp
Beispielaufrufe:

Code: Alles auswählen

>>> from sim3 import sim
>>> sim('a')
(1, 'a', 0, 'c')
>>> sim(1)
(1, 'a', 0, 'c')
>>> sim(3)
(0, 'c', 1, 'a')
>>> sim('c')
Zufallssequenzen bekommt man mit dieser Funktion:

Code: Alles auswählen

def snake(anz3er):
    a = anz3er
    dic = {1 : 'abc',2 : 'acb',3 : 'bca',4 : 'bac',
           5 : 'cba',6 : 'cab',7 : 'aab', 8 : 'aba',
           9 : 'baa',10 : 'bba',11 : 'abb',12 : 'bab',
          13 :'cca',14 : 'acc',15 : 'cac', 16 : 'aaa',
          17 : 'bbb', 18 : 'ccc', 19 :  'aac', 20 : 'ccb',
          21 : 'cbc',  22 : 'bcc', 23 : 'bbc', 24 : 'cbb',
          25 : 'bcb', 26 : 'aca', 27 : 'caa'}
    snake = ""
    for z in range(a):
        x = random.randint(1, 27)
        snake += dic[x]

    return snake
Testausgabe:

Code: Alles auswählen

>>> 
>>> from abc1 import snake
>>> snake(1)
'cca'
>>> snake(3)
'aaababaca'
>>> snake(1000)
'abbacacbbacacccbbcabcbaabccbbabbcbcaabbbcbbcbcbbbaaacbbbbbcbaaacb
acbcbccbbbbbabbabbaaccccccccbbbbabaabcbaacaccbbacaccaa....'
Danke fürs Mitdenken!
BlackJack

@wwwheimer: Du hast irgendwie immer noch nicht erklärt *warum* Du diese komischen 3er-Grüppchen brauchst!? Die blosse Behauptung das Spiel gebe eine Drittelung vor reicht da nicht, Du musst schon erklären *warum* das so sein soll. Dem ist nämlich nicht so. Du kannst Deine umständliche `snake()`-Funktion durch eine ersetzen die einfach 3mal so oft einen Einzelbuchstaben auswürfelt, ohne dass man von aussen einen Unterschied feststellen könnte:

Code: Alles auswählen

def snake(anz3er):
    return ''.join(random.choice('abc') for _ in xrange(anz3er * 3))
Die so erzeugten Ketten haben die gleichen Wahrscheinlichkeiten, als welche wo `anz3er` mal aus allen dreistelligen Möglichkeiten ausgewählt wird. Genau *das* ist wohl der Punkt an dem wir alle nicht so recht verstehen was Du da eigentlich bezwecken willst.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Ich habe grad keine Zeit (und Lust) den Code zu kommentieren, daher beschränke ich mich noch mal aufs wesentliche:

Ich habe immer noch nicht kapiert, was Du eigentlich machen willst!

Erst hieß es, eine KI schreiben, nun doch keine KI. Welchen Sinn haben diese 3er-Sequenzen? Ja, klar, man kann aus den Kombinationen alle möglichen abc-Schlangen zusammenbauen. Aber mit welchem Ziel? Das habe ich noch nicht kapiert!

Dein Gegner ist einfach eine "dumme" KI, die per Zufall aus "abc" wählt. Ok.

Wann / wie kommen jetzt diese "Schlangen" ins Spiel?

Edit: Hey, außer mir kann wohl noch jemand nicht schlafen? ;-) @BlackJack: bei Dir auch grad Gewitter?
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Hallo.

Und wo ist jetzt der Beleg, dass die Dreiergruppierung sinnvoll ist? Für mich sieht das nach einer vollkommen willkürlich gewählten Zahl aus, da du dich mit Wahrscheinlichkeitstheorie und Statistik nicht gut genug auskennst. Dir mag 3 hier zwar intuitiv richtig vorkommen, aber Intuition und Wahrscheinlichkeit sind nicht gerade gute Freunde. Das Brüche vermieden werden sollte finde ich ehrlich gesagt ein etwas abwegiges Argument.

Vielleicht zu deinem Code, da du etws lernen möchtest:
- Benutze richtige Namen; `sim` und `inp` sind nichtssagend.
- Die Zuweisung `a = inp` tut genau gar nichts außer einen neuen Namen zu erstellen.
- `elif` existiert
- Das ganze Mapping von a,b,c auf 1,2,3 kann man mit einem Dictionary geschickter lösen.
- `aplay = 0; bplay = 0` kannst du in zwei Zeilen schreiben; und natürlich richtige Namen vergeben
- `if a == b: pass else: ...` ist sehr umständlich. Benutze `if not a == b` oder in diesem Fall direkt `if a != b`
- Das Mapping von 1,2,3 nach a,b,c geht natürlich auch wieder einfacher
- Warum schreibst du das Mapping doppelt hin? Einmal für `a` und einmal für `b`? Benutze Funktionen.
- Es wurde dir glaube ich schon einmal gesagt "snake" ist das Tier. Du suchst "chain", "queue" oder in diesem Fall wahrscheinlich eher "sequence".
- Warum benutzt du `dic` als Dictionary, wenn du offensichtlich Indizes verwendest? Das sollte eine Liste sein oder ein Tupel. Außedem ist es in der Informatik üblich beginnend ab 0 zu zählen.
- Strings solltest du nicht mit `+` zusammensetzen, sondern sie alle in eine Liste packen und am Ende darauf `"".join` anwenden

Sebastian
Hyperion hat geschrieben:Edit: Hey, außer mir kann wohl noch jemand nicht schlafen? ;-) @BlackJack: bei Dir auch grad Gewitter?
Ich habe mich auch gerade gewundern, dass es noch zwei Posts gab ^^ Hier in Berlin ist noch kein Gewitter, bei mir ist es nur noch der Rest vom Jetlag. Danach schiebe ich es dann aufs Wetter ...
Das Leben ist wie ein Tennisball.
Benutzeravatar
wwwheimer
User
Beiträge: 25
Registriert: Sonntag 17. Juli 2011, 16:35

Was haben Euch meine Dreier bloss angetan? :roll:
Ich hatte es weiter oben schon angeesprochen und gesagt, dass ich die Dreier brauche, um auch Sequenzen konstruieren zu können, die ein sich wiederholendes Muster ergeben: (aaabbbcccaaabbbccc).
Das geht nicht per Zufall, sondern da muss ich schon die einzelnen Dreier aneinanderreihen und diese auch über einen eindeutigen Index auswählen können.

Warum Muster, bzw. Symetrien?
Weil ich davon ausgehe, dass auch Zufallsgeneratoren nach Regeln funktionieren und diese Regeln auch Spuren in Form von Mustern hinterlassen. Und darum finde ich den Gedanken gar nicht so abwegig, mit Hilfe von Mustern nach den vermuteten Mustern der Random-Fuktion zu suchen.
Uff!
Grüße!
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Hallo.

Deine Dreiersequenzen stören uns, weil diese vollkommen willkürlich gewählt sind und keinerlei Sinn machen. Deine Erklärung für deren Notwendigkeit ist einfach falsch. Wie BlackJack bereits geschrieben hat, ist es vollkommen irrelevant, ob du k-mal zufällig aus den 27 3er-Sequenzen wählst, oder k*3-mal zufällig aus "abc". Du findest damit keine Muster oder Symmetrien.

Vielleicht solltest du dir vorher noch anschauen, wie Pseudozufallszahlengeneratoren funktionieren, bevor du dort nach Mustern suchst. Du gehst da viel zu naiv ran. Warum schreibst du dir nicht einfach eine eigene KI, welche Muster produzierst und analysierst diese dann. Da kannst du dir über das Ergebnis auch sicher sein. So eine KI könnte zum Beispiel immer den letzten Zug des Gegners wiederholen oder wählt per Zufall und nimmt dieses Element k Mal in Folge oder es wird eine feste Sequenz immer wieder abgearbeitet oder ...

Sebastian
Das Leben ist wie ein Tennisball.
BlackJack

@wwwheimer: Wir verstehen halt nicht was Du mit diesen Dreiern bezwecken willst. Keine Deiner Erklärungen ergibt für mich einen Sinn. Insbesondere ist keine bis zum Ende erklärt. Ich bleibe jedes mal mit einem „Ja und nun!?”- oder „Aber *warum*!?”-Gefühl zurück. Man kann 'aaabbbcccaaabbbccc' auch ohne ein Wörterbuch mit allen Dreiern erzeugen. Aber es bleibt auch immer noch die Frage warum es unbedingt dreier sind? Warum nicht Zweier? Oder Vierer? Oder eben Einer!

Vielleicht setzt Du Dich erst einmal mit dem Zufallszahlengenerator auseinander, den Python verwendet. Der „Mersenne Twister” wurde mit statistischen Simulationen im Hinterkopf entworfen. Es ist ziemlich unwahrscheinlich das man da einfache Muster finden wird. Aus der Doku:
help(random) hat geschrieben:General notes on the underlying Mersenne Twister core generator:
  • The period is 2**19937-1.
  • It is one of the most extensively tested generators in existence.

...
Benutzeravatar
wwwheimer
User
Beiträge: 25
Registriert: Sonntag 17. Juli 2011, 16:35

@EyDu,
auf Deine 'Warums' kann ich nur sagen, dass ich mit den vielen tollen Sprachkonstrukten
noch gar nicht vertraut bin. Tupel, Iteratoren, Generatoren, Collections.... Alles neu für
mich. Es braucht halt seine Zeit, bis ich mit den neuen Möglichkeiten was anfangen kann.

Was Du hier sagst:"Das Brüche vermieden werden sollte finde ich ehrlich gesagt
ein etwas abwegiges Argument.", ist unüberlegt.
Schau Dir mal zB mein Avatar an. Das Orginal war 81x81px groß und alle Linien waren
gleich dick. Aber ich mußte es auf die hier erlaubten 80x80px reduzieren und nun hat
dieses Bytequadrat zwei ungewollte dickere Mittellinien.
Das ist nur ein Beispiel dafür, dass Teilbarkeit besser vorher bedacht werden sollte.

@BlackJack:
Zufällig ergeben die 27 Dreier eine Sequenz aus 81 Zeichen.
Zufällig besteht das Tao Te King aus 81 Kapiteln.
Zufällig gibt es neben Links und Rechts eine Mitte!
Auch 'zufällig' habe ich schon einmal vor dem Problem gestanden, als ich mir das I Ging
vorgenommen hatte. Da wird auch jede Linie des 'Bildes' mit einem Wurf von drei Münzen
erzeugt.
Es ist wohl wahr, ich habe auch einige subjektive bzw. intuitive Gründe. Das mag irrational
sein, aber es ist so.

Grüße!
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Hallo.

Meine ganzen Anmerkungen über deinen Code dienen natürlich dazu, dass du neue Konstrukte kennen lernst und diese anwenden kannst. Deshalb habe ich noch dazu geschrieben, was du verbessern solltest. Sonst wäre Kritik für beie Seiten etwas sinnlos ^^

Dein Argument zum Brüche vermeiden, in diesem Fall die Skalierung von Bildern, ist doch vollkommen aus dem Kontext gerissen. Natürlich macht es manchmal sinn darauf zu achten, aber eben nicht immer. Und ich sehe ich überhaupt keine Notwendigkeit auf ganze Zahlen Rücksicht zu nehmen.

Zu deinen "Argumenten" des letzten Postes bezüglich Zufälle: was hat das bitte mit diesem Problem zu tun? Du bringst hier "intuitive Gründe" oder "Intuition" ins Spiel, wo sie überhaupt nicht angebracht ist. Du solltest zumindest begründen könne, warum du so vorgehst und warum du glaubst, dass das sinnvoll ist. Immerhin haben wir dir gezeigt, dass deine Dreierreihen im moment keinen Sinn machen, da man genau so gut jede andere Länge verwenden kann. Vielleicht solltest du ein wenig Mathemathik fragen und dich nicht in Zahlenspielen verwickeln.

Sebastian
Das Leben ist wie ein Tennisball.
BlackJack

@wwwheimer: Es gibt Probleme bei denen man über Teilbarkeit nachdenken kann, aber bei Wahrscheinlichkeiten die üblicherweise durch Dezimalbrüche zwischen 0 und 1 angegeben werden, ist es schon ein wenig abwegig das vermeiden zu wollen. Wenn Du vorher tatsächlich nachgedacht hättest, statt einfach mal prophylaktisch Brüche vermeiden zu wollen, hättest Du jetzt auch ein Argument bringen können welche Vorteile das bringt oder welche Nachteile es vermeidet. Insbesondere entsteht das Problem mit dem Avatar doch nur weil dort nur mit ganzen Zahlen in einem Raster gearbeitet wird statt mit Dezimalbrüchen.

Soso, 27·3 ist also *zufällig* 81? Tao Te King!? :shock: Heiliges fliegendes Spaghettimonster. Du hast Oben und Unten vergessen. Du willst einen Mersenne Twister mit Esoterik analysieren. Na dann mal viel Spass. :roll:
Benutzeravatar
wwwheimer
User
Beiträge: 25
Registriert: Sonntag 17. Juli 2011, 16:35

@BlackJack, Du hast doch bestätigt, dass im Ergebnis sich meine aus Dreiern erzeugten
Sequenzen nicht von denen unterscheiden, die aus einzelnen Zeichen zusammengesetzt
werden. Warum machst Du, macht Ihr, daraus so ein grosses Problem? In meinen Augen
st das jetzt schon irrational: Es spielt zwar keine Rolle, wie ich die Sequenzen erzeuge,
aber ich habe sie so zu erzeugen 'wie man es macht'!

Also, Ihr könnt mich gern in eine Eso-Ecke stecken, wenn ihr nur aufhört an meiner
Dreierteilung zu nörgeln. 8)

Jetzt will ich die nächste Funktion angehen und mir einen 'Rangier-Bahnhof' für meine
Sequenzen basteln. Was sich dazu am besten eignet - Tupel, Listen, oder was sonst noch
in Frage kommt, das kann ich nicht abschätzen. Was ist dazu wohl am besten geeignet.

BlackJack, bevor ich es vergesse. Du hattest mich darauf hingewiesen, dass ich 'return
zu einer Funktion' mache. Aber einen Unterschied in der Wirkung kann ich nicht feststellen.
Ob ich return mit oder ohne Klammer schreibe, scheint keine Rolle zu spielen. Dass ich da
überhaupt Klammern benutzt habe, war ein Zufall. Vielleicht kannst Du mir dieses
Verhalten des Interpreters erklären, der ist doch sonst so pingelig. Auch dass ich der
Funktion Int- u. Str-Zeichen übergeben kann, irritiert mich.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Hallo.

Wir haben doch nie behauptet, dass man mit den Dreiergruppen nicht alle Kombinationen erzeugen könnte. Unsere Aussage ist, dass die Gruppierung in jeweils drei Elemente unnötig ist, da sich die Schlangen genau so gut durch beliebige einzelne zufällige Werte erzeugen lassen. Du machst es also komplizierter als es ist. Das problematische daran ist, dass du nicht verstehst, oder nicht verstehen willst, dass deine Erzeugung unserer entspricht; nur komplizierter und unnötig mit den Längen als Vielfaches von 3.

Du wirst nicht deshalb in die Eso-Ecke geschoben, weil du die Dreierteilung benutzt, sondern weil du sie mit esoterisch anmutenden Argumenten "begründest". Fange doch einfach an dir selber die Wahrscheinlichkeiten zu berechnen, das sind hier ja immer nur ein paar Multiplikationen. Du kannst ja gerne an deine sinnvolle Aufteilung glauben, die Zahlen sprechen leider gegen dich. Im Prinzip erhälst du am Ende eine 3*n lange zufällige Zeichenkette und willst damit Muster in einer anderen finden. Das wird relativ schwer ;-)

Daher noch einmal mein Hinweis: rechne dir die Wahrscheinlichkeiten aus, überlege dir dann, ob deine Sequenzen noch sinnvoll sind oder nicht. Das Ergebnis haben wir dir ja bereits vorweg genommen, außer du kommst jetzt noch mit dem riesigen magischen Verfahren, welches du bisher vergessen hast zu erwähnen ^^ Am Ende wirst du das Problem mit einem wahrscheinlichkeitstheoretischem Ansatz oder stochastischem Prozess modellieren müssen, sonst wirst du keine vernünftigen Aussagen über deinen Ansatz treffen können.

Zum Thema Listen/Tupel/Dictionaries: Listen solltest du immer dann verwenden, wenn du die Liste selbst noch anpassen möchtest, also Elemente aus ihr löschen oder hinzufügen. Tupel bieten sich dann an, wenn die Anzahl der Elemente vorher bekannt und du die Sequenz nicht mehr ändern möchtest. Dictionaries brauchst du dann, wenn du einen Schlüssel und ein Wert hast, welcher duch den Schlüssel repräsentiert wird. Im Prinzip sind Listen Spezialfälle von Dictionaries.

Zum `return`: Python wirft keinen Fehler wenn du Klammern setzt, da der Ausdruck `return (x)` korrekt ist. In diesem Fall erzeugen die Klammern einen einfachen geklammerten Ausdruck, welcher sich zu `x` vereinfachen lässt. Im Prinzip wie `(42*23+1)` das selbe ist wie `42*23+1`.

Sebastian

Edit: Zu den Typen dar Parameter: du kannst sowohl Integer als auch Strings, so wie alle anderen Typen übergeben, da Python mit den Typen dynamisch umgeht. Erstmal ist alles was du an einen Namen binden kannst ein Objekt, dies kannst du auch als Parameter übergeben. Erst wenn du auf den Objekten Operationen ausführst werden Typen - und zwar sehr streng - getestet. Einfache Beispiele: `1+2`. `2.0+3.0`, `"abc"+"cde"`. Im ersten Fall benutzt du den `+`-Operator für die Addition von Integern, im zweiten Fall für die Addition von rationalen Zahlen und im dritten hängst du zwei Strings aneinander. `+` ist dabei eigentlich nichts anderes als eine Funktion, welche die Typen der Parameter testet und dann die richtige Operation auswählt.
Das Leben ist wie ein Tennisball.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Ich möchte die Diskussion noch einmal voran bringen: Lassen wir mal diese 3er-Sequenzen außen vor, denn immerhin sollte nun klar sein, dass man sie so wie Du erzeugen kann, oder eben auch einfacher. Sei es drum. Aber wozu dienen sie? Wozu brauchst Du diese Sequenzen im Spiel? Diese elementare Frage habe ich noch nicht begriffen... bzw. Du noch nicht beantwortet. Irgend wann ging es mal um eine KI, dann wieder nicht... ich bin da out of sync mit Dir!
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Hallo.

Sequenzen zu analysieren scheinen mir ein ganz vernünftiger Weg zu sein um Spielzüge des Gegners, so lange dieser sich nicht vollkommen zufällig verhält, vorauszusagen. Ich habe das einfach mal mit einigen n-Grammen versucht und die Ergebnisse sind recht brauchbar. Im Prinzip sind das natürlich nur bedingte Wahrscheinlichkeiten der vorangegangenen Züge Z1, Z2, ..., Zm für den Nächsten Zug des Gegners X. Ich hatte bisher noch nicht die Motivation dazu, darüber könnte man natürlich auch herausfinden, wie groß n sein sollte, in wie weit Züge von einander unabhängig sind, ob es sinnvoll ist mehrere n-Gramme für die Voraussagen zusammen zu werfen und eine Voraussage darüber treffen, wie groß die Wahrscheinlichkeit ist, dass der Gegner gerade einen Strategiewechsel durchgeführt hat.

Ich bin mir sicher, dass dieser Ansatz schon einmal getester wurde, er ergibt sich auch recht natürlich. Vielleicht sollte man einfach mal nach Papern oder Beiträgen dazu suchen. Wenn die Motivation wieder da ist ^^

Sebastian
Das Leben ist wie ein Tennisball.
Antworten