Lottο!?!?

Petros Tsantoulis ptsant at otenet.gr
Wed Oct 3 23:49:01 EEST 2001


Xμ... αναρωτιέμαι τι ακριβώς θέλετε με το θέμα του Λόττο. 
Είχα γράψει προ αιώνων (όταν είχα 386DX40 με Slackware 2.1)
ένα χαρωπό πρόγραμμα λόττο σε C++. 

Φυσικά δεν έχει user interace γιατί υποστηρίζει πολλά features
και βαριόμουν να κάτσω να γράψω κώδικα που να κάνει parse κάποιο
configuration file (για GUI ούτε κουβέντα). Τις παραμέτρους
τις άλλαζα απευθείας στον κώδικα ;-)

Ο χρόνος εκτέλεσης είναι γελοίος (όχι δεν είναι μια αιωνιότητα
και μια μέρα) πχ 0.3 sec στον Athlon μου για 30 νούμερα.

Η λογική είναι αρκετά απλή :

α) Ο κάθε αριθμός έχει ένα "goodness" value.
β) Μπορούμε να αποκλείουμε συνδυασμούς που έχουν Ν μονούς
γ) Μπορούμε να αποκλείουμε συνδυασμούς που έχουν Ν μεγάλους
δ) Μπορούμε να αποκλείουμε συνδυασμούς που έχουν κάποια συγκεκριμένη
   μορφή με βάση τις δεκάδες (πχ 12, 13, 14, 15, 17, 22 είναι
   της μορφής 5-1 γιατί έχει 5 αριθμούς σε 1 δεκάδα)
ε) Μπορούμε να αποκλείουμε συνδυασμούς με βάση την συνολική πιθανότητα
   που παρουσιάζουν σε ότι αφορά τους μονούς και μεγάλους ταυτόχρονα
   θέτοντας ένα propability limit. Πχ να δεχόμαστε ένα συνδυασμό
   με 5 μονούς και 1 ζυγό εφόσον η κατανομή του (ως προς μικρά/μεγάλα)
   είναι τέτοια που να του εξασφαλίζει κάποια λογική πιθανότητα.
   Αυτό βγαίνει με βάση ένα πίνακα πιθανοτήτων (τους δημοσιεύαν
   στις εφημερίδες) για μονούς και μεγάλους.

Αν οι β-ε προυποθέσεις τηρούνται τότε ο συνδυασμός εκτυπώνεται
στο stdout μαζί με το άθροισμα των goodness.

Η τυπική χρήση είναι πχ lotto >log ; sort -gr log
και μετά πχ head -n NN log για να κρατήσεις όσες θέλεις.

Πχ τυπικό αποτέλεσμα:
<goodness> : αριθμοί
 70 : 5 8 12 21 29 40
 70 : 5 12 21 29 40 49
 70 : 5 12 21 29 40 47
 70 : 5 12 21 29 40 44
 70 : 5 12 21 29 40 41
 70 : 5 12 21 29 34 40
 70 : 5 12 21 29 33 40
 70 : 5 12 21 28 29 40
 70 : 5 12 21 27 29 40
 70 : 5 12 20 21 29 40
 69 : 5 12 21 22 29 40
 69 : 5 12 16 21 29 40


Η χρήση μνήμης είναι ασήμαντη γιατί οι συνδυασμοί δεν διατηρούνται 
στη μνήμη. Απλά παράγονται ένας ένας και όσοι απο αυτούς πληρούν
τα β-ε κριτήρια εκτυπώνονται στην οθόνη. Το πρόγραμμα δεν 
χρησιμοποιεί καν την malloc().

Τέσπα, ο βασικός λόγος που το παράτησα (πέραν του οτι δεν 
έπαιζα Λόττο) ήταν οτι κόλλησα σε ένα θεμελιώδες πρόβλημα
(για το οποίο δεν έχω καταφέρει ούτε σήμερα να βρώ λύση).

Αφού αφαιρέσουμε απο τους συνδυασμούς των Ν πραγμάτων ανα 6 
αυτούς που δε μας αρέσουν θα πάρουμε ένα σύνολο πχ Κ εξάδων.

Πως μπορούμε να επανα"συμπιέσουμε" αυτό το σύνολο σε
Λ σύνολα Μ αριθμών (Μ>=6) ωστε κάθε εξάδα που υπάρχει στο
σύνολο Κ εξάδων να υπάρχει σε ένα απο τα Λ σύνολα, αλλά
όχι πάνω απο μία φορά για όλα αυτά. Το Λ πρέπει να είναι 
ελάχιστο.

Η σημασία αυτού είναι οτι μετατρέπει το output των Κ
εξάδων σε ισοδύναμα σύνολα 7άδων, 8άδων, 9άδων κλπ.
Ετσι, πχ αντί να μας δώσει 256 εξάδες (λέμε τώρα)
θα μας δώσει ισοδύναμα μια 8άδα, μια 7άδα και πχ 7
εξάδες (λέμε τώρα, πάλι) και δε θα μας βγει το
χέρι να συμπληρώνουμε δελτία.

Tέσπα, όταν βγεί ο 4ος τόμος του Κnuth θα βρώ κάπου
εκει μέσα τη λύση ;-)

Π.


Υ.Γ. Και φυσικά, ως γνωστόν είτε χρησιμοποιείς πρόγραμμα
     είτε όχι η πιθανότητα να κερδίσεις είναι πάντα
     Ρ=στήλες που παίζεις/13*10^6. (για τον ίδιο λόγο
     που κάθε φορά που ρίχνεις ζάρι η πιθανότητα να
     φέρεις 6 είναι η ίδια). Το γεγονός αυτό δίνει μια
     ματαιότητα στην όλη ιστορία του να χρησιμοποιείς
     Η/Υ. 

-- 
----------------------------------------------------------
GPG key available upon request. Also from keys.pgp.com.
Please verify fingerprint before using.
----------------------------------------------------------
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 232 bytes
Desc: not available
URL: <http://lists.hellug.gr/pipermail/linux-greek-users/attachments/20011003/e24f4ca7/attachment.pgp>


More information about the Linux-greek-users mailing list