TextToolbox Άμεσα εργαλεία κειμένου

Γεννήτρια Τυχαίων Αριθμών

Ορίστε ένα εύρος και μια ποσότητα — κάθε αριθμός δημιουργείται με κρυπτογραφικά ασφαλή και αμερόληπτη τυχαία πηγή, εξ ολοκλήρου στο πρόγραμμα περιήγησής σας.

Αμερόληπτη τυχαιότητα, όχι απλώς «αρκετά τυχαία»

Αυτή η γεννήτρια αντλεί από την crypto.getRandomValues(), μια κρυπτογραφικά ασφαλή τυχαία πηγή — όχι την Math.random(), η οποία είναι γρήγορη αλλά φτιαγμένη για κινούμενα γραφικά και παιχνίδια, όχι για κάτι όπου η δικαιοσύνη του αποτελέσματος έχει πραγματική σημασία. Το να αποκτήσετε μια ασφαλή πηγή είναι μόνο η μισή δουλειά· η μετατροπή μιας ακατέργαστης τιμής 32 bit σε έναν αριθμό μέσα στο επιλεγμένο εύρος σας χωρίς να εισαχθεί μεροληψία απαιτεί ένα ακόμη βήμα, που ονομάζεται δειγματοληψία απόρριψης. Η απλοϊκή προσέγγιση — τυχαίαΤιμή % εύρος — ευνοεί ελάχιστα το κάτω άκρο του εύρους κάθε φορά που το 2³² δεν διαιρείται ακριβώς με το μέγεθος εκείνου του εύρους. Αυτό το εργαλείο αντ' αυτού υπολογίζει το μεγαλύτερο πολλαπλάσιο του εύρους σας που χωράει κάτω από το 2³², και απορρίπτει (και επαναλαμβάνει) κάθε ακατέργαστη τιμή που πέφτει πάνω από εκείνο το όριο, ώστε κάθε αριθμός στο εύρος να αντιστοιχεί σε ακριβώς τον ίδιο αριθμό πιθανών ακατέργαστων επιλογών — χωρίς εξαιρέσεις, χωρίς μεροληψία, για οποιοδήποτε εύρος επιλέξετε.

Παράδειγμα

Ρίξτε ένα ζάρι: ελάχιστο 1, μέγιστο 6, οπότε το εύρος καλύπτει 6 αριθμούς. Το 2³² είναι 4.294.967.296, και το 4.294.967.296 ÷ 6 αφήνει υπόλοιπο 4 — οπότε το μεγαλύτερο πολλαπλάσιο του 6 που χωράει είναι το 4.294.967.292. Κάθε ακατέργαστη τιμή που πέφτει στις 4 ανώτερες τιμές (από 4.294.967.292 έως 4.294.967.295) απορρίπτεται και ξαναδοκιμάζεται· κάθε άλλη τιμή μειώνεται με % 6 και μετατοπίζεται κατά 1 ώστε να πέσει στο 1–6. Το ποσοστό απόρριψης εδώ είναι περίπου 0,00000009% των επιλογών — στην πράξη, ουσιαστικά δεν θα δείτε ποτέ να συμβαίνει επανεπιλογή, αλλά η εγγύηση ισχύει για κάθε εύρος, ακόμη και για όσα είναι αρκετά μικρά ώστε ένα απλοϊκό modulo να στρέβλωνε ορατά τα αποτελέσματα.

Με το «Να επιτρέπονται διπλότυπα» αποεπιλεγμένο — επιλέγοντας 6 μοναδικούς αριθμούς από το 1 έως το 49, όπως ένα δελτίο λαχείου — το εργαλείο επιλέγει αριθμούς με τον ίδιο αμερόληπτο τρόπο και διατηρεί ένα σύνολο σε εξέλιξη, ξαναδοκιμάζοντας σε κάθε επανάληψη, μέχρι να έχει 6 διακριτές τιμές. Ζητήστε περισσότερους μοναδικούς αριθμούς από όσους μπορεί να προσφέρει το εύρος — ας πούμε, 20 μοναδικούς από ένα εύρος μόλις 10 — και θα δείτε ένα σαφές μήνυμα σφάλματος αντί για σιωπηλή αποτυχία: «Δεν είναι δυνατή η δημιουργία 20 μοναδικών αριθμών μεταξύ 1 και 10 — αυτό το εύρος έχει μόνο 10 αριθμούς για επιλογή.»

Συχνές ερωτήσεις

Γιατί crypto.getRandomValues αντί για Math.random;

Η Math.random() είναι ένας γρήγορος, προβλέψιμος ψευδοτυχαίος αλγόριθμος φτιαγμένος για πράγματα όπως κινούμενα γραφικά και παιχνίδια — δεν είναι κρυπτογραφικά ασφαλής, και σε ορισμένες μηχανές προγράμματος περιήγησης η εσωτερική της κατάσταση μπορεί να ανακατασκευαστεί από λίγα μόνο αποτελέσματα. Η crypto.getRandomValues() αντλεί από την κρυπτογραφικά ασφαλή γεννήτρια τυχαίων αριθμών του λειτουργικού συστήματος, την ίδια πηγή που χρησιμοποιείται για κλειδιά κρυπτογράφησης. Για μια γεννήτρια αριθμών φτιαγμένη για κάτι που έχει πραγματική σημασία — μια κλήρωση, ένα παιχνίδι, μια δειγματοληψία — αυτή είναι η ειλικρινής πηγή πάνω στην οποία χτίζεις, το πρότυπο που εφαρμόζει αυτή η πλατφόρμα σε κάθε γεννήτριά της.

Τι είναι η μεροληψία modulo, και πώς την αποφεύγει η δειγματοληψία απόρριψης;

Ο απλοϊκός τρόπος για να μετατρέψετε έναν τυχαίο αριθμό 32 bit σε, ας πούμε, μια ζαριά, είναι το `τυχαίαΤιμή % 6`. Αυτό εισάγει μεροληψία κάθε φορά που το εύρος της τυχαίας πηγής δεν διαιρείται ακριβώς με το εύρος-στόχο σας — κάποια υπόλοιπα καταλήγουν ελάχιστα πιο πιθανά από άλλα. Με μια πηγή 32 bit (4.294.967.296 πιθανές τιμές) και ένα μικρό εύρος όπως 1–6, αυτή η μεροληψία είναι αστρονομικά μικροσκοπική, αλλά δεν είναι μηδενική, και με μικρότερες τυχαίες πηγές (όπως ένα μόνο byte, 0–255) γίνεται αρκετά μεγάλη ώστε να στρεβλώσει πραγματικά τα αποτελέσματα. Η δειγματοληψία απόρριψης το διορθώνει εντελώς: αυτό το εργαλείο υπολογίζει το μεγαλύτερο πολλαπλάσιο του εύρους σας που χωράει σε 32 bit, απορρίπτει κάθε ακατέργαστη τιμή που πέφτει πάνω από εκείνο το όριο, και κρατά μόνο τιμές που αντιστοιχίζονται εξίσου ομοιόμορφα. Το ποσοστό απόρριψης είναι μικροσκοπικό (δείτε το παράδειγμα παρακάτω), οπότε δεν κοστίζει τίποτα στην πράξη ενώ εγγυάται μηδενική μεροληψία, για οποιοδήποτε εύρος.

Μπορεί να εμφανιστεί ο ίδιος αριθμός περισσότερες από μία φορές;

Εξαρτάται από το πλαίσιο ελέγχου «Να επιτρέπονται διπλότυπα». Επιλεγμένο (η προεπιλογή) σημαίνει ότι κάθε αριθμός επιλέγεται ανεξάρτητα, οπότε οι επαναλήψεις είναι δυνατές και, για μικρά εύρη, πιθανές. Αν το αποεπιλέξετε, γίνεται δειγματοληψία χωρίς επανατοποθέτηση — το εργαλείο συνεχίζει να επιλέγει μέχρι να έχει τόσους διακριτούς αριθμούς, και μετά σταματά. Αν ζητήσετε περισσότερους μοναδικούς αριθμούς από όσους πραγματικά περιέχει το εύρος — ας πούμε, 20 μοναδικούς αριθμούς μεταξύ 1 και 10 — δεν υπάρχουν αρκετές διακριτές τιμές για να ικανοποιηθεί το αίτημα, και το εργαλείο σας το επισημαίνει αντί να κολλήσει ή να επιστρέψει σιωπηλά λιγότερους αριθμούς απ' όσους ζητήσατε.

Πόσο μεγάλο μπορεί να είναι το εύρος ή η παρτίδα;

Το ελάχιστο και το μέγιστο μπορούν να είναι οποιοιδήποτε ακέραιοι, θετικοί ή αρνητικοί, αρκεί το εύρος μεταξύ τους (μέγιστο − ελάχιστο + 1) να παραμένει κάτω από περίπου 4,29 δισεκατομμύρια — το μέγεθος της τυχαίας πηγής 32 bit που χρησιμοποιεί αυτό το εργαλείο, αρκετό για κάθε ρεαλιστική χρήση, από ένα κορώνα-γράμματα μέχρι ένα εύρος πολλών δισεκατομμυρίων. Η ποσότητα περιορίζεται σε 1000 αριθμούς ανά παρτίδα, όπως και οι άλλες γεννήτριες μαζικής παραγωγής αυτής της πλατφόρμας, και είναι ακαριαία και στις δύο περιπτώσεις, αφού κάθε επιλογή σπάνια χρειάζεται περισσότερες από μία προσπάθειες.