Τυχαίοι κλασματικοί αριθμοί php. Δημιουργεί έναν τυχαίο αριθμό

Τεχνικά, ο όρος «γεννήτρια τυχαίων αριθμών» είναι ανοησία, αφού οι ίδιοι οι αριθμοί δεν είναι τυχαίοι. Για παράδειγμα, το 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; $i= 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(), καθώς αυτό γίνεται πλέον αυτόματα.

Εργο
Πρέπει να δημιουργήσετε έναν τυχαίο αριθμό μέσα σε ένα αριθμητικό εύρος.

Λύση
Η συνάρτηση mt_rand() έχει σχεδιαστεί για αυτό:

// τυχαίος αριθμός μεταξύ $upper και $lower, συμπεριλαμβανομένων
$random_number = mt_rand($lower, $upper);

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

$random_number = mt_rand(1, 100);

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

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

Το MT (Mersenne Twister) είναι μια γεννήτρια ψευδοτυχαίων αριθμών που πήρε το όνομά του από τον Γάλλο μοναχό και μαθηματικό Marin Mersenne, ο οποίος μελέτησε τους πρώτους αριθμούς. Ο αλγόριθμος αυτής της γεννήτριας βασίζεται σε αυτούς τους πρώτους αριθμούς. Η συνάρτηση mt_rand() είναι ταχύτερη από τη συνάρτηση rand() και παράγει περισσότερους τυχαίους αριθμούς, επομένως προτιμάμε την πρώτη.

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

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

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

$sth = $dbh->query("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 τυχαιοποιεί πρώτα τις σειρές και στη συνέχεια επιστρέφει την πρώτη σειρά.

Γεια σε όλους! Σε αυτό το άρθρο, θα δούμε τι νέο υπάρχει για τη δημιουργία τυχαίων αριθμών στην PHP 7.1.

Αυτή η ενημέρωση έγινε αόρατη στους προγραμματιστές, αλλά βελτίωσε τη γλώσσα Προγραμματισμός PHPστον τομέα της δημιουργίας τυχαίων αριθμών.

Από όσο γνωρίζουμε, στην PHP μπορούμε να χρησιμοποιήσουμε τη συνάρτηση rand(min, max) για να δημιουργήσουμε τυχαίους αριθμούς:

Echo rand(7, 17);

Εάν ανανεώνετε τώρα τη σελίδα, θα λαμβάνετε έναν νέο τυχαίο αριθμό κάθε φορά.

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

Στην PHP 7.1 αυτό το πρόβλημα διορθώθηκε και προστέθηκε η συνάρτηση mt_rand():

Echo mt_rand(7, 17);

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

Πολλές άλλες λειτουργίες για τη δημιουργία τυχαίων αποτελεσμάτων έχουν βελτιωθεί στην PHP 7.1. Για παράδειγμα, ας δούμε πώς μπορούμε να πάρουμε μια τυχαία τιμή από έναν πίνακα:

$names = ["Ivan", "Alexander", "Vasiliy"];
echo $names;

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

mob_info