Php τυχαίος αριθμός από 1 έως 10. Τι νέο υπάρχει στην PHP7.1: δημιουργία τυχαίων αριθμών. Τυχαίοι αριθμοί σε JavaScript

Με έχουν ρωτήσει ήδη μερικές φορές πώς κάνω τυχαίες προσφορές στον ιστότοπό μου στο μπλοκ "Έξυπνες προσφορές". Στη συνέχεια, κατάφερα να μάθω ότι το πρόβλημα εδώ είναι με τους ανθρώπους που δεν καταλαβαίνουν πώς να εξάγουν ένα τυχαίο στοιχείο από έναν πίνακα στην PHP. Το έργο είναι απλό, αλλά παρόλα αυτά, εφόσον προκύπτουν ερωτήματα, πρέπει να απαντηθούν.

Θα σου δώσω τον κωδικό αμέσως. Ας υποθέσουμε ότι υπάρχει ένας πίνακας με ένα σύνολο εισαγωγικών. Και πρέπει να επιλέξετε ένα τυχαίο από αυτά και να εξάγετε:

Το βασικό σημείο είναι να πάρεις έναν τυχαίο αριθμό. Το μόνο που έχετε να κάνετε είναι να βάλετε τα σωστά όρια. Εάν πρέπει να επιλέξετε ένα τυχαίο στοιχείο σε όλο το μήκος του πίνακα, τότε είναι από 0 έως (μήκος πίνακα μείον 1). Και στη συνέχεια απλά τραβήξτε ένα στοιχείο από τον πίνακα με τον τυχαίο δείκτη που προκύπτει.

Όσον αφορά την εργασία με εισαγωγικά, είναι καλύτερο να τα αποθηκεύσετε σε μια βάση δεδομένων. Κατ 'αρχήν, εάν ο ιστότοπος είναι πολύ απλός, τότε μπορεί να γίνει σε αρχείο κειμένου. Αλλά εάν σε μια βάση δεδομένων, τότε είναι καλύτερο να χρησιμοποιήσετε RAND() και LIMIT στο ερώτημα SQL, έτσι ώστε να λαμβάνετε αμέσως ένα μόνο και τυχαίο απόσπασμα από τη βάση δεδομένων.

Για να δημιουργήσετε έναν τυχαίο αριθμό, μπορείτε να χρησιμοποιήσετε τη συνάρτηση PHP rand() ή mt_rand(). Η απαίτηση χρήσης τυχαίων αριθμών προκύπτει συχνά στην πράξη για την ονομασία μεταβλητών, αρχείων, τη δημιουργία βασικών πληροφοριών και τη διασφάλιση της ασφάλειας.

Τυχαιότητα και μοναδικότητα

Η τυχαία συνάρτηση PHP διατίθεται σε δύο παραλλαγές: rand() και mt_rand(). Πιστεύεται ότι ο αλγόριθμος στην πρώτη περίπτωση είναι απλούστερος και παράγει ψευδοτυχαίους αριθμούς. Η δεύτερη επιλογή έχει ταχύτερο αλγόριθμο και γνωστά μαθηματικά χαρακτηριστικά. Στις περισσότερες περιπτώσεις, όταν χρειάζεται να λάβετε έναν τυχαίο αριθμό, μπορείτε να χρησιμοποιήσετε μια σειρά από τυχαίες κλήσεις PHP και να λάβετε έναν μοναδικό συνδυασμό αριθμών.

Εάν λάβετε ως βάση αριθμούς από το 1 έως το 26 ή από το 1 έως το 32 και τους λάβετε τυχαία, μπορείτε να σχηματίσετε βασικές πληροφορίες ως ακολουθία λατινικών ή κυριλλικών γραμμάτων. Σε αυτήν την περίπτωση, η PHP random είναι ένας τρόπος δημιουργίας μιας ακολουθίας αλφαβητικών πληροφοριών, για παράδειγμα για τους σκοπούς της δοκιμής καναλιών επικοινωνίας ή αλγορίθμων.

Ένας τυχαίος αριθμός είναι σπάνια μοναδικός επειδή μπορεί να εμφανίζεται πολλές φορές σύμφωνα με τον νόμο κατανομής μιας τυχαίας μεταβλητής. Αλλά αν συνδυάσετε, συγκεκριμένα, τη στατική μεταβλητή PHP & Math.random της γλώσσας JavaScript, μπορείτε να πάρετε έναν πραγματικό μοναδικό τυχαίο αριθμό που δεν θα επαναληφθεί με την πάροδο του χρόνου.

Χρήση της συνάρτησης ώρας

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

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

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

Μια γεννήτρια τυχαίων αριθμών PHP είναι μια εξαιρετική λύση για τις περισσότερες εργασίες, ειδικά όταν χρειάζεται να λάβετε γρήγορα αποτελέσματα υψηλής ποιότητας με ελάχιστη προσπάθεια. Η χρήση των συναρτήσεων rand() και mt_rand σε συνδυασμό με διαδοχικά αυξανόμενες σειρές αριθμών ή χρονικών τιμών σάς επιτρέπει να λαμβάνετε τυχαίους αριθμούς, τόσο επαναλαμβανόμενους σε τιμές όσο και μοναδικούς.

Αρχικοποιεί τη γεννήτρια τυχαίων αριθμών. Σύνταξη:

Void srand (int seed)

Αρχικοποιεί τη γεννήτρια τυχαίων αριθμών με την τιμή σπόρου.

Srand((double) microtime()*1000000);
$random = rand();
echo $τυχαία;

GETRANDMAX

Επιστρέφει τον μεγαλύτερο δυνατό τυχαίο αριθμό. Σύνταξη:

Int getrandmax()

Αυτή η συνάρτηση επιστρέφει τη μέγιστη τιμή που μπορεί να ληφθεί χρησιμοποιώντας τη συνάρτηση δημιουργίας τυχαίων αριθμών rand().

Συνήθως είναι 32767

Δημιουργεί έναν τυχαίο αριθμό. Σύνταξη:

Int rand()

Όταν καλείται με τις προαιρετικές παραμέτρους min και max, αυτή η συνάρτηση δημιουργεί έναν τυχαίο αριθμό μέχρι και συμπεριλαμβανομένων αυτών των παραμέτρων. Εάν λείπουν οι παράμετροι min και max, επιστρέφεται ένας αριθμός που κυμαίνεται από 0 έως RAND_MAX.

Για να λειτουργήσει σωστά αυτή η συνάρτηση, πριν τη χρησιμοποιήσετε, πρέπει να αρχικοποιήσετε τη γεννήτρια τυχαίων αριθμών με τη συνάρτηση srand().

lcg_value()

Γεννήτρια ψευδοτυχαίων αριθμών LCG (PHP 4, PHP 5)

Περιγραφή:

Float lcg_value (κενό)

Η lcg_value() επιστρέφει έναν ψευδοτυχαίο αριθμό στην περιοχή (0, 1). Η συνάρτηση συνδυάζει δύο γεννήτριες με 2^31 - 85 και 2^31 - 249 σε μια περίοδο.

mt_getrandmax()

Εμφανίζει τη μεγαλύτερη δυνατή τυχαία τιμή (PHP 3 >= 3.0.6, PHP 4, PHP 5)

Περιγραφή:

Int mt_getrandmax (κενό)

Εμφανίζει τη μέγιστη τιμή που μπορεί να επιστραφεί από το mt_rand()

mt_rand()

Δημιουργεί την καλύτερη τυχαία τιμή (PHP 3 >= 3.0.6, PHP 4, PHP 5)

Περιγραφή:

int mt_rand()

Πολλές παλαιότερες εκδόσεις γεννητριών τυχαίων αριθμών έχουν αμφισβητήσιμα χαρακτηριστικά και είναι αργές. Από προεπιλογή, η PHP χρησιμοποιεί τη συνάρτηση rand() για τη δημιουργία τυχαίων αριθμών. Η συνάρτηση mt_rand() είναι μια καλή αντικατάσταση. Χρησιμοποιεί μια γεννήτρια τυχαίων αριθμών που είναι 4 φορές ταχύτερη από την rand() και χρησιμοποιεί Mersenne Twister.

Καλείται χωρίς τα προαιρετικά ορίσματα min και max, η mt_rand() επιστρέφει μια ψευδοτυχαία τιμή που κυμαίνεται μεταξύ 0 και RAND_MAX. Εάν πρέπει να λάβετε, για παράδειγμα, τυχαίες τιμές μεταξύ 5 και 15 συμπεριλαμβανομένων, αναζητήστε mt_rand (5, 15).

Παράδειγμα χρήσης mt_rand()

Το αποτέλεσμα της εκτέλεσης αυτού του παραδείγματος θα είναι κάπως έτσι:

1604716014
1478613278
6

Σχόλιο

Σημείωση: Σε εκδόσεις πριν από την 3.0.7, η δεύτερη παράμετρος της συνάρτησης καθόριζε το εύρος των αριθμών. Για παράδειγμα, για να λάβετε τυχαίους αριθμούς μεταξύ 5 και 15 σε αυτές τις εκδόσεις, πρέπει να καθορίσετε τη συνάρτηση mt_rand(5, 11).

mt_srand()

Ορίζει την αρχική τιμή της καλύτερης γεννήτριας τυχαίων αριθμών (PHP 3 >= 3.0.6, PHP 4, PHP 5)

Περιγραφή:

Void mt_srand()

Ορίζει την αρχική τιμή της γεννήτριας τυχαίων αριθμών χρησιμοποιώντας το seed. Από την PHP 4.2.0, το seed είναι προαιρετικό και οι προεπιλεγμένες ρυθμίσεις για τυχαίες τιμές παραλείπονται.

Παράδειγμα χρήσης mt_srand()

Σημείωση: Από την PHP 4.2.0, δεν είναι πλέον απαραίτητο να αρχικοποιήσετε τη γεννήτρια τυχαίων αριθμών με srand() ή mt_srand(), καθώς αυτό γίνεται πλέον αυτόματα.

Τεχνικά, ο όρος «γεννήτρια τυχαίων αριθμών» είναι ανοησία, αφού οι ίδιοι οι αριθμοί δεν είναι τυχαίοι. Για παράδειγμα, το 100 είναι τυχαίος αριθμός; Τι γίνεται με τα 25; Αυτό που στην πραγματικότητα σημαίνει αυτός ο όρος είναι ότι δημιουργεί μια ακολουθία αριθμών που εμφανίζονται τυχαία. Αυτό εγείρει ένα πιο δύσκολο ερώτημα: τι είναι μια ακολουθία τυχαίων αριθμών; Η μόνη σωστή απάντηση: μια ακολουθία τυχαίων αριθμών είναι μια ακολουθία στην οποία όλα τα στοιχεία δεν σχετίζονται μεταξύ τους. Αυτός ο ορισμός οδηγεί στο παράδοξο ότι οποιαδήποτε ακολουθία μπορεί να είναι είτε τυχαία είτε μη τυχαία, ανάλογα με τον τρόπο με τον οποίο λαμβάνεται η ακολουθία. Για παράδειγμα, η ακόλουθη σειρά αριθμών
1 2 3 4 5 6 7 8 9 0
λήφθηκε πληκτρολογώντας την επάνω γραμμή του πληκτρολογίου με τη σειρά, επομένως η ακολουθία δεν μπορεί να θεωρηθεί ότι δημιουργήθηκε τυχαία. Τι γίνεται όμως αν έχετε την ίδια σειρά όταν βγάζετε τις αριθμημένες μπάλες του τένις από το βαρέλι. Σε αυτήν την περίπτωση, είναι ήδη μια τυχαία δημιουργημένη ακολουθία. Αυτό το παράδειγμα δείχνει ότι η τυχαιότητα μιας ακολουθίας εξαρτάται από τον τρόπο λήψης της και όχι από την ίδια την ακολουθία.

Θυμηθείτε ότι μια ακολουθία αριθμών που δημιουργείται από υπολογιστή είναι ντετερμινιστική: κάθε αριθμός εκτός από τον πρώτο εξαρτάται από τους αριθμούς πριν από αυτόν. Τεχνικά, αυτό σημαίνει ότι μόνο μια σχεδόν τυχαία ακολουθία αριθμών μπορεί να δημιουργηθεί από έναν υπολογιστή, δηλ. στην πραγματικότητα δεν είναι πραγματικά τυχαία. Ωστόσο, αυτό είναι αρκετό για τις περισσότερες εργασίες και για απλότητα τέτοιες ακολουθίες θα ονομάζονται τυχαίες. Μια πολύ ενδιαφέρουσα μέθοδος αναπτύχθηκε από τον John von Neumann. συχνά ονομάζεται ρίζα μέσου τετραγώνου. Σε αυτή τη μέθοδο, ο προηγούμενος τυχαίος αριθμός τετραγωνίζεται και στη συνέχεια εξάγονται τα μεσαία ψηφία από το αποτέλεσμα. Για παράδειγμα, εάν δημιουργείτε αριθμούς με τρία ψηφία και ο προηγούμενος αριθμός ήταν 121, τότε ο τετραγωνισμός του δίνει το αποτέλεσμα 14641. Η απομόνωση των μεσαίων τριών ψηφίων δίνει τον επόμενο τυχαίο αριθμό 464. Το μειονέκτημα αυτής της μεθόδου είναι ότι έχει πολύ σύντομη περίοδος επανάληψης, που ονομάζεται κύκλος. Για το λόγο αυτό, αυτή η μέθοδος δεν χρησιμοποιείται σήμερα. Οι σύγχρονες μέθοδοι παραγωγής τυχαίων αριθμών είναι πολύ πιο περίπλοκες.

Τυχαίοι αριθμοί στην PHP

Η PHP έχει δύο ομάδες συναρτήσεων για εργασία με τυχαίους αριθμούς. Καθαρά εξωτερικά, μπορούν να διακριθούν από το πρόθεμα mt_ για όλες τις συναρτήσεις μιας από τις ομάδες.

Καταργημένες λειτουργίες
συνάρτηση rand Επιστρέφει έναν ακέραιο μεταξύ του μηδέν και της τιμής RAND_MAX (που είναι 32767). Μπορεί να έχει δύο προαιρετικές ακέραιες παραμέτρους - εάν καθορίζονται, δημιουργείται ένας τυχαίος αριθμός από την πρώτη παράμετρο στη δεύτερη.

Echo rand(); echo rand(1.100); // Δώστε έναν τυχαίο αριθμό από το 1 έως το 100

Λειτουργία srand. Καθορίζει την ακολουθία των τυχαίων αριθμών που παράγονται από τη συνάρτηση rand. Έχει μια ολόκληρη παράμετρο - για διαφορετικές τιμές αυτής της παραμέτρου, η rand θα παράγει διαφορετικές ακολουθίες αριθμών. Η συνάρτηση srand χρειάζεται να κληθεί μόνο μία φορά πριν από όλες τις κλήσεις στη συνάρτηση rand. Παράδειγμα χρήσης:

Srand(1288); // Εκκίνηση της γεννήτριας τυχαίων αριθμών για($i=0; $iquery("SELECT COUNT(*) AS count FROM quotes");
if ($row = $sth->fetchRow()) (
$count = $σειρά;
) άλλο (
die ($row->getMessage());
}
$random = mt_rand(0, $count - 1);
$sth = $dbh->query("SELECT quote FROM quotes LIMIT $random,1");
ενώ ($row = $sth->fetchRow()) (
εκτυπώστε τη σειρά $.

"\n";
}

Αυτό το απόσπασμα κώδικα καθορίζει τον συνολικό αριθμό σειρών στον πίνακα, δημιουργεί έναν τυχαίο αριθμό από αυτό το εύρος και, στη συνέχεια, χρησιμοποιεί LIMIT $random,1 για να επιλέξει μία σειρά από τον πίνακα που ξεκινά από τη θέση $random. Στην MySQL έκδοση 3.23 ή νεότερη, είναι δυνατή μια εναλλακτική επιλογή:

$sth = $dbh->query("SELECT quote FROM quotes ORDER BY RAND() LIMIT 1");
ενώ ($row = $sth->fetchRow()) (
εκτυπώστε τη σειρά $. "\n";
}

Σε αυτήν την περίπτωση, η MySQL τυχαιοποιεί πρώτα τις σειρές και στη συνέχεια επιστρέφει την πρώτη σειρά.