7 / 3 / 2020
Στο προπροηγούμενο post έλεγα για την τυχαιότητα στους ηλεκτρονικούς υπολογιστές και για ένα random seed που έχω φτιάξει. Συνεχίζω εδώ επειδή νομίζω πως η τυχαιότητα, και όχι μόνο στους υπολογιστές, έχει ενδιαφέρον ως θέμα.
Κατέληξα σε μια καινούργια λειτουργία, όπως έγραψα πριν, αλλά τελικά είχε κι αυτή τα δικά της bugs όπως αποδείχτηκε. Την τσέκαρα διεξοδικά, βάζοντάς τη να μου δώσει 500 φορές αποτελέσματα από έναν τριψήφιο τυχαίο αριθμό και πάλι έχανε κάποια νούμερα.
Μια απ’τα ίδια, δηλαδή. Όπως λένε, «άλλαξε ο Μανωλιός κι έβαλε το βρακί του αλλιώς».
Μετά, όμως, πρόσεξα ότι τα νούμερα που χάνει δεν είναι τα ίδια με την προηγούμενη λειτουργία, και το ξανασκέφτηκα. Και είπα: Ίσως, τελικά, να μην είναι ο Μανωλιός αλλά ο Νικολιός. Ή, αλλιώς: Γιατί δεν χρησιμοποιείς και τις δύο λειτουργίες συγχρόνως;
Τις έκανα, λοιπόν, υπολειτουργίες μια ευρύτερης λειτουργίας, και το σύστημα να επιλέγει τυχαία (50% πιθανότητα) ποια από τις δύο να χρησιμοποιήσει κάθε φορά. Έτσι, αύξησα την εντροπία.
Το τσέκαρα πάλι με 500 αποτελέσματα, και είδα ότι τώρα έχανε λιγότερους αριθμούς. Αλλά πάλι έχανε κάποιους. Βέβαια, με τέτοιο αυξημένο αριθμό εντροπίας, δεν μπορείς να ξέρεις τι ακριβώς συμβαίνει. Αλλά έχανε κάποιους αριθμούς, και δεν ήταν τόσο λίγοι· οπότε δεν ήμουν ακόμα ικανοποιημένος.
Χρειαζόταν να αυξήσω κι άλλο την εντροπία. Αλλά πώς; Τι άλλη λειτουργία ακόμα να ρίξω εκεί μέσα; Τι απέμενε; Μόνο ένα πράγμα δεν είχα κάνει: ceil. Αυτό σημαίνει στρογγυλοποίηση πάντα προς το μεγαλύτερο (το ανάποδο του floor). Δηλαδή, το 10,2 να γίνεται 11, όπως και το 10,7.
Το έβαλα, λοιπόν, κι αυτό μέσα στο παιχνίδι. Τώρα, το σύστημα επιλέγει τυχαία μία από τις τρεις λειτουργίες και χρησιμοποιεί αυτήν. Η εντροπία είναι πολύ, πολύ μεγαλύτερη.
Το τσεκάρα πάλι 500 φορές, και τώρα είδα ότι έχανε ελάχιστα νούμερα. Μήπως, όμως, αυτό, λόγω αυξημένης εντροπίας, ήταν τυχαίο;
Έκανα ακόμα μια δοκιμή. Χρησιμοποίησα εκείνο το πρόγραμμα που έχω φτιάξει το οποίο μου δίνει τυχαίες εικόνες. Το ρύθμισα έτσι ώστε κάθε φορά που πετάει μια τυχαία εικόνα να σβήνει και τη διαδρομή της (filepath) από ένα αρχείο που περιέχει τις διαδρομές όλων των εικόνων. Το έβαλα να τρέξει συνεχόμενα. Κάποιες εικόνες εμφανίστηκαν δύο φορές, κάποιες τρεις φορές, κάποιες πέντε φορές· κάποιες μόνο μία φορά. Αλλά αυτό είναι η τυχαιότητα· δεν ξέρεις τι θα εμφανιστεί. Στο τέλος το αρχείο άδειασε· δεν έμεινε τίποτα μέσα. Αυτό σημαίνει ότι η λειτουργία για τυχαίους αριθμούς κάποια στιγμή έβγαλε όλους τους αριθμούς που έπρεπε να βγάλει· και το πλήθος των εικόνων ήταν τριψήφιος αριθμός.
Οπότε, τώρα είμαι αρκετά ικανοποιημένος με αυτή τη λειτουργία για τυχαίους αριθμούς. Έχει και μεγάλη διασπορά – δηλαδή, δεν έρχονται τα ίδια και τα ίδια συνέχεια – και δεν χάνει νούμερα στους μεγάλους αριθμούς. Βέβαια, ίσως κάπου κάτι να χάνει. Δεν μπορείς ποτέ να είσαι 100% σίγουρος με τέτοια πράγματα. Πάντως, φαίνεται καλύτερη απ’οτιδήποτε άλλο έχω ποτέ δοκιμάσει.
Πολλές λειτουργίες για τυχαίους αριθμούς δεν έχουν καλή διασπορά. Αυτό δεν σημαίνει απαραίτητα ότι δεν είναι καλές. Απλά ότι δεν έχουν καλή διασπορά. Εξαρτάται για τι δουλειά τον θέλεις τον τυχαίο αριθμό. Εγώ ήθελα να έχει καλή διασπορά. Ήθελα, πχ, να μπορεί να μιμηθεί σωστά τη ρίψη τριών ζαριών που είναι σχετικά σπάνιο να φέρουν και τα τρία ζάρια τον ίδιο αριθμό.
Αλλά ένα βασικό πρόβλημα που νομίζω πως έχουν όλοι οι τυχαίοι αριθμοί στα ηλεκτρονικά συστήματα είναι ότι, κυρίως στους μεγάλους αριθμούς, δεν έχουν όλα τα νούμερα τις ίδιες ακριβώς πιθανότητες να εμφανιστούν. Πχ, αν του ζητήσεις να σου βγάλει αριθμό από το 1 ώς το 345, είσαι σίγουρος ότι ο κάθε αριθμός έχει πιθανότητα εμφάνισης 1/345; Μάλλον δεν έχει. Αλλά αυτό συνήθως δεν σε ενοχλεί και πολύ.
Πάντως, όταν θέλω έναν αληθινά τυχαίο αριθμό, πάντα προτιμώ να ρίξω ζάρια. Με πολυεδρικά ζάρια (όπως αυτά που χρησιμοποιούνται σε πολλά παιχνίδια και κυρίως στα RPG) μπορείς να εξάγεις οποιονδήποτε τυχαίο αριθμό. Και το εννοώ. Οποιονδήποτε. Θα έγραφα τώρα και πώς ακριβώς να το κάνεις, αλλά αυτό το post είναι ήδη μεγάλο και βαριέμαι. Σε επόμενο post πιθανώς.
Από την άλλη, βέβαια, πρέπει να αναρωτηθείς και το εξής: Ακόμα και τα ζάρια είσαι σίγουρος ότι έχουν, πχ, πιθανότητα 1/6 ακριβώς να εμφανίσουν κάθε αριθμό; Το θέμα είναι ότι δεν ξέρουμε τι δυνάμεις ασκούνται όταν ρίχνεις ένα ζάρι, οπότε δεν μπορείς να το προβλέψεις και μοιάζει όντως τυχαίο. Ακόμα κι αν φτιάξεις ένα μηχάνημα που εκτοξεύει ζάρια (και δεν είμαι σίγουρος ότι αυτό δεν υπάρχει ήδη) με την ίδια δύναμη και από την ίδια γωνία, πάλι τα ζάρια δεν θα φέρνουν πάντα τα ίδια νούμερα. Γιατί παίζουν ρόλο και πολλά άλλα πράγματα. Μπορείς να υποθέσεις τη βαρύτητα, την αντίσταση του αέρα, και ίσως και πράγματα που δεν τα ξέρουμε.
Όπως και νάχει, αυτό το post παραέγινε μεγάλο και ήδη βαριέμαι να το ξανακοιτάξω για να το διορθώσω...
(Αλλά το έκανα τελικά.)
(Παίζει να έχουν μείνει λάθη. Ο δαίμων του blog.)
6 / 3 / 2020
Κάνοντας μια βόλτα στο ελληνικό διαδίκτυο, μπορείς να δεις τον nCoV γραμμένο είτε ως κορονοϊό είτε ως κοροναϊό. Είναι ένα από τα γνωστά ελληνικά φαινόμενα που άλλοι γραφούν κάτι έτσι, άλλοι το γράφουν αλλιώς, και επικρατεί μια σχετική σύγχυση. Από την άλλη, γιατί να μην είναι τα πράγματα πολυμορφικά σε μια γλώσσα; Είναι καλύτερα να είναι μονολιθικά, να υπάρχει μόνο μία σωστή χρήση; Δεν το νομίζω. Νομίζω πως η πολυμορφικότητα είναι καλύτερη, ακόμα κι αν δημιουργεί μια κάποια σύγχυση ορισμένες φορές.
Όμως, στη συγκεκριμένη περίπτωση, ποιο είναι το σωστό;
Κοίτα, το Wiktionary το γράφει κορονοϊός, οπότε αυτό είναι, κατά πρώτον, ένα καλό σημάδι για να θεωρήσεις ότι αυτή είναι η σωστή χρήση.
Από την άλλη, κι εμένα το κορονοϊός μού ακούγεται καλύτερο από το κοροναϊός. Ηχητικά και μόνο.
Αλλά ας δούμε τι είναι αυτή η λέξη. Είναι, προφανώς: κορόνα + ιός. Επομένως, λογικά, δεν θα έπρεπε το σωστό να είναι κοροναϊός; Γιατί, αλλιώς, πού πήγε το άλφα, βρε αδελφέ; Γιατί έγινε όμικρον;
Καλή ερώτηση. Όμως αυτή είναι η φύση των σύνθετων λέξεων: πολλές φορές χρησιμοποιούν το -ο- ως συνδετικό γράμμα-μπαλαντέρ ακόμα κι αν δεν υπάρχει μέσα στην αρχική λέξη. Ωστόσο, αυτό δεν συμβαίνει πάντα. Συμβαίνει κατά περίσταση. Και η περίσταση εξαρτάται είτε από το συνήθειο είτε από το γούστο.
Πάρε για παράδειγμα τη λέξη σκιαμαχώ. Συναρμολογείται από σκιά + μάχομαι, και διατηρεί το άλφα.
σκιαμαχώ: -είς, -εί ρ. μάχομαι εναντίον ανύπαρκτων εχθρών, αγωνίζομαι άσκοπα
—Μείζον Ελληνικό Λεξικό, Τεγόπουλος-Φυτράκης
[Κλείσε πάλι· σε βαριέμαι]
Αλλά δες μετά ότι υπάρχει και η λέξη σκιόφοβος. Συναρμολογείται από σκιά + φόβος. Γιατί να μην είναι σκιάφοβος;
σκιόφοβος: -η, -ο επίθ. (Κ -ος, -ον) που φοβάται ή αποστρέφεται τη σκιά, το σκοτάδι
—Μείζον Ελληνικό Λεξικό, Τεγόπουλος-Φυτράκης
[Κλείσε πάλι· σε βαριέμαι]
Ή, αντιστρόφως, γιατί το σκιαμαχώ να μην είναι σκιομαχώ; Δεν θα ήταν το ίδιο σωστό;
Και στις δύο περιπτώσεις, και τα δύο θα μπορούσαν να είναι σωστά. Απλά αυτή είναι τώρα η χρήση που συνηθίζεται.
(Θυμήσου τι λέγαμε για την πολυμορφικότητα της γλώσσας.)
Παρομοίως, πρόσεξε: μακρόβιος (μακρύς + βίος), αλλά μακρυμάλλης (και μακρομάλλης επίσης) (μακρύς + μαλλιά). Και πολλά άλλα ακόμα...
Το -ο- γενικά παίρνει θέση ενωτικού στοιχείου που μπορεί να αντικαταστήσει το τελευταίο γράμμα της λέξης η οποία αποτελεί πρώτο συνθετικό στοιχείο της σύνθετης λέξης.
Οπότε, και το κορονοϊός και το κοροναϊός είναι το ίδιο σωστά. Αλλά εμένα μού αρέσει καλύτερα το κορονοϊός. Άρα, αυτό είναι πιο σωστό. Εντάξει;
5 / 3 / 2020
Τελευταία ασχολούμαι με προγραμματισμό πολύ περισσότερο απ’ό,τι παλιά (ίσως να έχω κολλήσει κάποιο μικρόβιο) και έτυχε να παρατηρήσω κάτι που κι αρκετοί άλλοι προγραμματιστές έχω διαβάσει ότι έχει τύχει να παρατηρήσουν: Πολλοί τυχαίοι αριθμοί που βγάζουν οι υπολογιστές δεν είναι αρκετά τυχαίοι.
Αλλά ορισμένες φορές θέλω να βάλω το μηχάνημα να μου δώσει μια σειρά από τυχαίους αριθμούς που δεν μοιάζουν στημένοι. Οπότε, κάθισα και έγραψα ένα δικό μου random seed.
Το random seed, για όσους δεν ξέρουν, είναι ένας δεκαδικός αριθμός της μορφής μηδέν-κόμμα-κάτι (πχ, 0,234554) ο οποίος αλλάζει κάθε τόσο. Το πιο απλό είναι να βάλεις το σύστημα να τον φτιάχνει βάσει των κλασμάτων του δευτερολέπτου κάθε δεδομένη στιγμή.
Μετά, το seed το πολλαπλασιάζεις με τον μέγιστο και τον ελάχιστο αριθμό που θες να πάρεις – πχ, από 1 έως 10. Έτσι, τελικά, έχεις μια υπολογιστική λειτουργία σαν αυτή (περίπου ίδια σ’όλες τις γλώσσες προγραμματισμού): seed * (max - min) + min. Και όλο αυτό το κάνει floor, δηλαδή το στρογγυλοποιήσεις προς τα κάτω. Πχ, αν έρθει 10,6 γίνεται 10. Επομένως, η λειτουργία καταλήγει να είναι κάπως έτσι: floor(seed * (max - min) + min).
Και αυτό, αν είναι καλοφτιαγμένο το seed, φαίνεται να βγάζει αρκετά σωστά αποτελέσματα. Πχ, του βάζεις να σου δώσει 20 τυχαίους αριθμούς από το 1 έως το 10, και βλέπεις όλους τους αριθμούς να παρουσιάζονται χωρίς πολλές ομοιότητες μεταξύ τους. Τουτέστιν, καλή διασπορά.
Μετά, όμως, αν του βάλεις να σου δώσει μεγαλύτερους αριθμούς – πχ, από το 1 έως το 245 – βλέπεις να αρχίζουν κάποια προβλήματα. Ορισμένοι αριθμοί δεν εμφανίζονται ποτέ. Και, θα μου πει, πού το πρόσεξες μέσα σε τόσο μεγάλους αριθμούς; Και η αλήθεια είναι πως είναι δύσκολο να το προσέξεις.
Το πρόσεξα επειδή έχω φτιάξει ένα πρόγραμμα που σου παρουσιάζει τυχαίες εικόνες. Και κάποιες δεν εμφανίζονταν ποτέ, όταν ήταν πολλές. Έψαξα, λοιπόν, και βρήκα τους αριθμούς των εικόνων που δεν εμφανίζονταν, και δοκίμασα το seed για να δω πόσες φορές μπορεί να σου δώσει αυτούς τους αριθμούς. 500 φορές το έβαλα να βγάλει αποτελέσματα. Και ξανά. Και ξανά. Και πάλι αυτοί οι αριθμοί δεν εμφανίζονταν.
Γιατί;
Μετά, το βρήκα. Έτσι μου φαίνεται, τουλάχιστον. Φταίει το floor – η στρογγυλοποίηση προς τα κάτω.
Μπορείς, όμως, να του βάλεις να στρογγυλοποιεί τον αριθμό, όχι προς τα κάτω, αλλά προς τον κοντινότερο ακέραιο. Πχ, το 80,3 να γίνεται 80, αλλά το 80,6 να γίνεται 81. Εδώ όμως, σύμφωνα με τις κλασικές υπολογιστικές λειτουργίες τύπου «seed * (max - min) ) + min» παρουσιάζεται ένα άλλο πρόβλημα. Αν του βάλεις, πχ, να σου δώσει αριθμό από 1 έως 10, μπορεί να σου δώσει και 0, ή και 11. Κατά τα άλλα, η διασπορά είναι καλή.
Πώς να αποφύγεις το ελάχιστο - 1 και το μέγιστο +1;
Η καλύτερη απάντηση σ’αυτό σκέφτηκα πως είναι ένα απλό loop. Και το ξέρω ότι αυτά είναι «κινέζικα» για όσους δεν ξέρουν από προγραμματισμό. Το loop είναι μια διαρκής επανάληψη της υπολογιστικής λειτουργίας μέχρι να συμβεί κάτι μέσα στο σύστημα. Οπότε, εδώ πρέπει να βάλεις να κάνει loop μέχρι που το αποτέλεσμά σου να μην είναι ελάχιστο-1 ή μέγιστο+1.
Το δοκίμασα και είδα πως η διασπορά βγαίνει καλή.
Οπότε, η υπολογιστική λειτουργία είναι κάπως έτσι:
num = ROUND(seed * (max - min) + min)
loop until (num > min-1) and (num < max+1)
Είναι καλύτερο από το άλλο; Φαίνεται, πάντως, να έχει καλύτερη διασπορά – βλέπω πιο πολλές τυχαίες εικόνες να βγαίνουν απ’ό,τι έβγαιναν πριν – αλλά δεν είναι πολύς καιρός που το έχω δοκιμάσει.
Θα δείξει...
4 / 3 / 2020
Ψαχουλεύοντας τυχαία στο παλιό blog των Σκιωδών Παραλειπομένων, βρήκα τρόπο αντιμετώπισης για τον κορονοϊό.
Ιδού, γαμώτο. Ιδού:
Δύο τρόποι αντιμετώπισης υπάρχουν για τα πράγματα που δεν τα θέλει ο οργανισμός ή η ψυχή: ή τα αποφεύγεις τελείως, ή τα κοπανάς μέχρι που να πάθεις ανοσία.
Πιάνει, επίσης, και για διάφορες άλλες παθήσεις διαφόρων ειδών.
Είχα έμπνευση τότε· τώρα, έχω ψιλοβαρεθεί.
3 / 3 / 2020
Τι είδε αυτή η τύπισσα και σοκαρίστηκε έτσι; Δε θέλω καν να φανταστώ. Δεν θέλω.
Μυστηριακές Οντότητες
138η σελίδα από τις 182
Προηγούμενη σελίδα
Επόμενη σελίδα