Στο προπροηγούμενο 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.)