Παρόλο που κανένας υπολογιστής δεν μπορεί να παράγει πραγματικά τυχαίους αριθμούς, ο Ruby παρέχει πρόσβαση σε μια μέθοδο που θα επιστρέψει ψευδοτυχώς αριθμούς.
Κανένας υπολογιστής δεν μπορεί να παράγει πραγματικά τυχαίους αριθμούς καθαρά με υπολογισμό. Το καλύτερο που μπορούν να κάνουν είναι να παράγουν ψευδοτυχώς αριθμούς, οι οποίοι είναι μια ακολουθία αριθμών που εμφανίζομαι τυχαία αλλά δεν είναι.
Για έναν ανθρώπινο παρατηρητή, αυτοί οι αριθμοί είναι πράγματι τυχαίοι. Δεν θα υπάρχουν σύντομες επαναλαμβανόμενες ακολουθίες και, τουλάχιστον στον άνθρωπο παρατηρητή, δεν θα παρουσιάσουν σαφή μοτίβο. Ωστόσο, δεδομένου αρκετού χρόνου και κινήτρου, το πρωτότυπο σπόρος μπορεί να ανακαλυφθεί, η ακολουθία αναπαραχθεί και ο επόμενος αριθμός στην ακολουθία μαντέψει.
Για το λόγο αυτό, οι μέθοδοι που αναφέρονται σε αυτό το άρθρο δεν θα πρέπει πιθανώς να χρησιμοποιηθούν για τη δημιουργία αριθμών που πρέπει να είναι κρυπτογραφικά ασφαλείς.
Οι γεννήτριες αριθμών ψευδοτυχαίων αριθμών πρέπει να είναι σπόρους
προκειμένου να παραχθούν ακολουθίες που διαφέρουν κάθε φορά που παράγεται ένας νέος τυχαίος αριθμός. Καμία μέθοδος δεν είναι μαγική - αυτοί οι φαινομενικά τυχαίοι αριθμοί δημιουργούνται χρησιμοποιώντας σχετικά απλούς αλγόριθμους και σχετικά απλή αριθμητική. Με τη σπορά του PRNG, ξεκινάτε σε διαφορετικό σημείο κάθε φορά. Εάν δεν το βάλατε, θα δημιουργούσε την ίδια σειρά αριθμών κάθε φορά.Στο Ruby, το Kernel # srand η μέθοδος μπορεί να καλείται χωρίς επιχειρήματα. Θα επιλέξει έναν τυχαίο αριθμό σπόρων βάσει του χρόνου, του αναγνωριστικού διεργασίας και ενός αριθμού ακολουθίας. Απλά καλώντας srand οπουδήποτε στην αρχή του προγράμματός σας, θα δημιουργήσει μια διαφορετική σειρά φαινομενικά τυχαίων αριθμών κάθε φορά που το τρέχετε. Αυτή η μέθοδος ονομάζεται σιωπηρά κατά την εκκίνηση του προγράμματος και σπείρει το PRNG με το αναγνωριστικό χρόνου και διεργασίας (χωρίς αριθμό ακολουθίας).
Μόλις το πρόγραμμα εκτελείται και Kernel # srand είτε κλήθηκε σιωπηρά είτε ρητά, το Kernel # rand μπορεί να καλείται η μέθοδος. Αυτή η μέθοδος, που καλείται χωρίς επιχειρήματα, θα επιστρέψει έναν τυχαίο αριθμό από το 0 στο 1. Στο παρελθόν, ο αριθμός αυτός τυπικά κλιμακώθηκε στο μέγιστο αριθμό που θα θέλατε να δημιουργήσετε και ίσως to_i την κάλεσε να την μετατρέψει σε ακέραιο αριθμό.
Ωστόσο, ο Ruby κάνει τα πράγματα λίγο πιο εύκολο αν χρησιμοποιείτε το Ruby 1.9.x. ο Kernel # rand μέθοδος μπορεί να λάβει ένα μόνο επιχείρημα. Αν αυτό το επιχείρημα είναι a Αριθμητικός οποιουδήποτε είδους, ο Ruby θα δημιουργήσει έναν ακέραιο αριθμό από 0 μέχρι και (χωρίς να συμπεριλαμβάνει) αυτόν τον αριθμό.
Ωστόσο, τι γίνεται αν θέλετε να δημιουργήσετε έναν αριθμό από 10 έως 15; Συνήθως, θα δημιουργήσετε έναν αριθμό από το 0 έως το 5 και θα το προσθέσετε στο 10. Ωστόσο, ο Ruby το διευκολύνει.
Βεβαιωθείτε ότι προσέχετε τους δύο τύπους εύρους. Αν καλέσατε rand (10..15), που θα δημιουργούσε έναν αριθμό από 10 έως 15 συμπεριλαμβανομένου 15. Ενώ rand (10... 15) (με 3 κουκκίδες) θα δημιουργούσε έναν αριθμό από 10 έως 15 δεν περιλαμβάνει 15.
Μερικές φορές χρειάζεστε μια τυχαία αναζητούμενη ακολουθία αριθμών, αλλά πρέπει να δημιουργείτε την ίδια ακολουθία κάθε φορά. Για παράδειγμα, εάν παράγετε τυχαίους αριθμούς σε μια δοκιμή μονάδας, θα πρέπει να δημιουργείτε την ίδια σειρά αριθμών κάθε φορά.
Μια δοκιμή μονάδας που αποτυγχάνει σε μία ακολουθία θα αποτύχει πάλι την επόμενη φορά που θα τρέξει, εάν δημιουργήσει μια ακολουθία διαφορών την επόμενη φορά, ίσως να μην αποτύχει. Για να το κάνετε αυτό, καλέστε Kernel # srand με γνωστή και σταθερή τιμή.
Η εφαρμογή της Kernel # rand είναι μάλλον un-Ruby. Δεν αφαιρεί το PRNG με οποιονδήποτε τρόπο, ούτε σας επιτρέπει να δημιουργήσετε παράσταση του PRNG. Υπάρχει μια παγκόσμια κατάσταση για το PRNG ότι όλες οι μετοχές κώδικα. Αν αλλάξετε τον σπόρο ή αλλιώς αλλάξετε την κατάσταση του PRNG, μπορεί να έχει ευρύτερο εύρος επίδρασης από ό, τι αναμενόταν.
Ωστόσο, δεδομένου ότι τα προγράμματα αναμένουν ότι το αποτέλεσμα αυτής της μεθόδου θα είναι τυχαίο - αυτό είναι ο σκοπός της! - αυτό πιθανώς δεν θα είναι ποτέ πρόβλημα. Μόνο εάν το πρόγραμμα αναμένει να δει μια αναμενόμενη ακολουθία αριθμών, όπως εάν είχε καλέσει srand με μια σταθερή τιμή, αν βλέπει απρόσμενα αποτελέσματα.