Seite 1 von 2

PyLotto

Verfasst: Dienstag 24. Februar 2009, 18:25
von Crackus
Ich habe mich (außerschulisch) damit befasst wie warscheinlich es ist einen sechser im Lotto zu haben (ca. 1/14.000.000)
ich habe ein programm geschrieben was mit den Zahlen 1,2,3,4,5,6 spielt
und jedes mal wenn man einen sechser hat die anzahl der dafürbenötigten versuche und einen hashwert (um schummeln zu vermeiden) ausgibt
um es interressant zu machen ein wettstreit wer schafft es mit den wenigsten versuchen einen sechser hinzukriegen???
einfach versuche und hash hier reinschreiben ich überprüfe ob die Zahl mit dem haswert zusammen passen und fertig
das programm gibt es hier : http://rapidshare.com/files/202043353/PyLotto.rar.html

dann viel spass^^
mein rekord liegt bei 1.9mio^^
Bisschen doof gemacht also man sieht nicht das das programm arbeitet^^
man wird es allerdings in der Systemüberwachung sehen

Verfasst: Dienstag 24. Februar 2009, 21:08
von hendrikS
Ich bin durchaus ineressiert, an dem was Leute hier so vorstellen. Mit Deinem Sammelsurium an *.so Files kann ich leider erst mal nichts anfangen. Vielleicht hast Du noch n'bisschen mehr zu bieten?

*.so

Verfasst: Dienstag 24. Februar 2009, 21:21
von Crackus
einfach die Datei LottoDauer(.exe??) starten^^

Verfasst: Dienstag 24. Februar 2009, 21:35
von cofi
Wie wärs, wenn du statt Kompilatem mal den Source anbietest? Vor allem kommt man dann auch mit einer Pastebin (http://paste.pocoo.org/) aus und brauch keinen schrottigen Hoster. Noch dazu ist der Anteil der Nutzer alternativer Betriebssysteme im Forum sehr hoch (ich würde sogar sagen der Großteil der Leute, die dir nützliche Tipps geben könnten)

naya

Verfasst: Dienstag 24. Februar 2009, 21:45
von Crackus
ich habe ya ein salt in die md5 dazugegeben a) um einen sicheren "Wettbewerb" zu geährleisten und b) damit ich auch richtige ergebnisse bekomme

ich stelle mall die source ohne salt rein
es gibt auch noch ein par kleinigkeiten die nicht ganz hübsch aussehen die ich so kaschieren kann^^

Edit : http://paste.pocoo.org/show/105246/
das is echt praktisch^^

Verfasst: Dienstag 24. Februar 2009, 22:19
von BlackJack
@Crackus: Also bei 6 aus 49 liegen die Chancen auf sechs Richtige bei 1/10.068.347.520 und nicht bei 1/14.000.000 -- pass also auf, dass Dein Mathelehrer hier nicht mitliest. ;-)

Edit: Habe gerade in den Quelltext geschaut: Du solltest hoffen, dass Dein Informatiklehrer auch nicht hier mitliest. :shock:

Verfasst: Dienstag 24. Februar 2009, 22:24
von cofi
Puh ... ich glaub ich gönn mir erstmal einen Schnaps bevor ich den Code nochmal anschaue ;)
Meine Kristallkugel sagt mir, dass das in weit unter 50 Zeilen geht. (Vielleicht wollen die Golfer aus dem andern Thread dazukommen? :twisted:)

Verfasst: Dienstag 24. Februar 2009, 22:27
von hendrikS
Wenn ich mich zurückerinnere ware die Chance "49 über 6" was genau 13983816 ist?

Verfasst: Dienstag 24. Februar 2009, 22:31
von BlackJack
@hendrikS: Kann sein, dass ich heute schon zu müde bin, aber für die erste Kugel hat man 49 Möglichkeiten, für die zweite bleiben noch 48, für die dritte 47, und so weiter. Das bringt mich zu:

Code: Alles auswählen

In [290]: 49*48*47*46*45*44
Out[290]: 10068347520L

Verfasst: Dienstag 24. Februar 2009, 22:38
von hendrikS
Ja, es geht aber um die Anzahl möglicher Kombinationen und die ist eben 49 über 6. Und die Wahrscheinlichkeit für jede Kombination ist gleich hoch. Also der Mathe Lehrer hat schon recht.

@Crackus. Schreib doch mal ein Programm für 49 über 6. Schöne Übung.

@Cofi: Apropos Golf: Postings für n über k kleiner 54 Bytes sind natürlich wilkommen :)

Verfasst: Dienstag 24. Februar 2009, 23:03
von derdon
So habe ich das mal in der Schule gelernt:

Code: Alles auswählen

>>> from __future__ import division
>>> (1/49) * (1/48) * (1/47) * (1/46) * (1/45) * (1/44)
9.9321164472479387e-11

Verfasst: Dienstag 24. Februar 2009, 23:11
von hendrikS
derdon hat geschrieben:So habe ich das mal in der Schule gelernt:

Code: Alles auswählen

>>> from __future__ import division
>>> (1/49) * (1/48) * (1/47) * (1/46) * (1/45) * (1/44)
9.9321164472479387e-11
Ich weiß leider nicht, was das für eine Schule ist oder war oder was Du für eine Schulbildung hast, aber das ist schlicht und einfach Käse. Der mathematische Hintergrund steht in meinem posting darüber.
Also ich kann mir beim besten Willen nicht vorstellen, daß Dir das ein Mathematiker beigebracht haben soll.

Verfasst: Dienstag 24. Februar 2009, 23:19
von BlackVivi
BlackJack hat geschrieben:@hendrikS: Kann sein, dass ich heute schon zu müde bin, aber für die erste Kugel hat man 49 Möglichkeiten, für die zweite bleiben noch 48, für die dritte 47, und so weiter. Das bringt mich zu:

Code: Alles auswählen

In [290]: 49*48*47*46*45*44
Out[290]: 10068347520L
Das, was an dieser Überlegung falsch ist - du berücksichtigst die Reihenfolge. In deinem Beispiel sind die Zahlen 1 2 3 4 5 6 andere als 1 3 2 4 5 6.

Beim Lotto aber nicht, deswegen brauchen wir diesen Binominialkoeffizenten, oder wie man's schreibt.

Verfasst: Dienstag 24. Februar 2009, 23:24
von derdon
Stimmt, ein kleiner Fehler ist mir unterlaufen. Hier die korrigierte Version:

Code: Alles auswählen

>>> from __future__ import division
>>> (6/49) * (5/48) * (4/47) * (3/46) * (2/45) * (1/44)
7.1511238420185173e-08
Wenn man das erste Kreuz macht, ist die Wahrscheinlichkeit, eine richtige Zahl zu treffen, 6:49 (logisch). Anschließend sind nur noch 48 Zahlen zum Ankreuzen da, weil man schon eines gemacht hat usw.. Aufgrund der Pfadregel werden die Quotienten miteinander multipliziert.

Verfasst: Dienstag 24. Februar 2009, 23:38
von Panke
Immernoch Käse.
Siehe hier

Interessant sind hier die Folien 5 und 6.
Wie BlackVivi schon sagte, gibt es (n über k) Teilmengen der Mächtigkeit k einer Menge der Mächtigkeit n. Genau eine Teilmenge führt aber zu 6 richtigen, also ist die Wahrscheinlichkeit 1 / (49 über 6).

Verfasst: Dienstag 24. Februar 2009, 23:48
von hendrikS
derdons korrigierte Lösung ist richtig.
Ist ja eigentlich eine extrem einfache Methode n über k zu berechnen.

Edit:Wenn man sich die Fakultäten aus n über k mal aufschreibt und dann kürzt kommt man genau auf derdons korrigierte Lösung.

Verfasst: Mittwoch 25. Februar 2009, 06:30
von Crackus
>>> from __future__ import division
>>> (6/49) * (5/48) * (4/47) * (3/46) * (2/45) * (1/44)
7.1511238420185173e-08

das ist richtig
das heißt die warscheinlichkeit im lotto zu gewinnen beträgt 7.1511238420185173e-06%
und die warscheinlichkeit das du gewinnst liegt bei 1 / 13983815.999999998 also etwa 1/14mio

also meine rechnung war schon richtig und bei dem quelllcode kann man ne menge sparen
z.B. (ist mir gestern abend noch aufgefallen) mehrere male global
import timer ist in der version auch nicht nötig
noch ein bissl mehr muss weg bye

Verfasst: Mittwoch 25. Februar 2009, 08:07
von BlackJack
@Crackus: Da sollte man sich *alle* ``global`` sparen, die durchnummerierten Namen durch eine geeignete Datenstruktur, zum Beispiel `list` ersetzen und diese ganzen Wiederholungen von nahezu identischem Quelltext durch (echte) Funktionen und Schleifen ersetzen.

Re: naya

Verfasst: Mittwoch 25. Februar 2009, 12:11
von tordmor
Crackus hat geschrieben:http://paste.pocoo.org/show/105246/
:shock: :shock:

Code: Alles auswählen

import random

population = range(1, 50)
target = (1, 2, 3, 4, 5, 6)
sample = None
count = 0

while sample != target:
    sample = tuple(sorted(random.sample(population, 6)))
    count += 1

print "Gotcha! (%d)" % count

okay das triffts perfekt

Verfasst: Mittwoch 25. Februar 2009, 13:56
von Crackus
okay das passt ich kenne einige Befehle daraus noch nicht (lerne noch nicht solange python)
und wollte eigentlich nur durch ein Programm den random befehl vertiefen und deswegen ein "kleines" Programm geschrieben was lotto simuliert.
habe dass dann schnell in eine endlosschleife getan und fertig.
aber ich finde es sehr schön das leute nicht nur sagen das kann man verbessern (was mir auch hilft) sondern auch mal einen sauberen und sehr professionellen Code reinstellen
Vielen dank an tordmor

ich werde das Programm noch mit einem hash versehen und hochladen (kann leider kein C um den Hash zu machen :( sry)

Vielen dank für Vorschläge und Verbesserungen#

PS: Rekord liegt immer noch bei 1.900.000

Edit: Vieleicht kann hier irgendwer den kleinen abschnitt in C schreiben und mir die Source zuschicken???
Müsste ich es nur noch in den Pythoncode implentiert kriegen^^
Aber das schaffe ich!!! hoffe ich
ansonsten hätte ich ya ein sehr nettes Forum was mir hoffentlich helfen würde^^