Php satunnainen kokonaisluku. Luo satunnaisluvun. Syntaksi

Tehtävä
Sinun on luotava satunnaisluku numeroalueella.

Ratkaisu
Funktio mt_rand() on suunniteltu tähän:

// satunnaisluku välillä $ylempi ja $alempi, mukaan lukien
$satunnainen_luku = mt_rand($alempi, $ylempi);

Keskustelu
Satunnaislukujen luominen on hyödyllistä, kun haluat näyttää satunnaisen kuvan näytöllä, määrittää satunnaisesti aloituspisteen pelissä, valita satunnainen merkintä tietokannasta tai luo yksilöllinen istuntotunniste. Jotta voit luoda satunnaisluvun kahden pisteen välissä, sinun on välitettävä kaksi argumenttia mt_rand()-funktiolle:

$satunnainen_luku = mt_rand(1, 100);

Mt_rand():n kutsuminen ilman argumentteja palauttaa luvun nollan ja suurimman satunnaisluvun väliltä, ​​jonka mt_getrandmax() palauttaa. Tietokoneen on vaikea luoda todella satunnaista lukua. Hän on paljon parempi noudattamaan ohjeita systemaattisesti, eikä ole niin hyvä, jos häntä vaaditaan toimimaan spontaanisti. Jos haluat pakottaa tietokoneen tuottamaan satunnaisluvun, sinun on annettava sille tietty joukko toistettavia komentoja, ja jo toistettavuuden tosiasia tekee satunnaisuuden saavuttamisen epätodennäköisemmän.

PHP:ssä on kaksi erilaista satunnaislukugeneraattoria: klassinen toiminto kutsutaan rand() ja kehittyneempi funktio mt_rand().

MT (Mersenne Twister) on pseudosatunnaislukugeneraattori, joka on nimetty alkulukuja tutkineen ranskalaisen munkin ja matemaatikon Marin Mersennen mukaan. Näillä alkuluvut ja algoritmi perustuu tästä generaattorista. Funktio mt_rand() on nopeampi kuin rand()-funktio ja tuottaa enemmän satunnaislukuja, joten pidämme parempana edellistä.

Jos sinulla on PHP versio aikaisempi kuin 4.2, niin ennen kuin kutsut mt_rand() (tai rand())-funktiota ensimmäistä kertaa, sinun on alustettava generaattori alkuarvolla kutsumalla mt_srand() (tai srand())-funktio. Alkuarvo on numero, joka satunnainen toiminto käyttää sitä perustana palauttamiensa satunnaislukujen luomiseen; se viittaa tapaan ratkaista edellä mainittu dilemma – toistettavuus vs. satunnaisuus.

Alkuarvoksi, joka muuttuu erittäin nopeasti ja toistettavuuden todennäköisyydellä on pieni (näiden ominaisuuksien pitäisi olla hyvä alkuarvo), voit ottaa suuren tarkkuuden aikafunktion microtime() palauttaman arvon. Riittää, kun generaattori alustetaan kerran. PHP 4.2 tai uudempi uudemmat versiot käsittelee alustuksen automaattisesti, mutta jos alkuarvo asetetaan manuaalisesti ennen ensimmäistä mt_rand()-kutsua, PHP ei korvaa sitä omalla alkuarvollaan.

Jos sinun on valittava tietokannasta satunnainen tietue, helpoin tapa on määrittää ensin taulukon kenttien kokonaismäärä, valita satunnaisluku kyseiseltä alueelta ja tehdä sitten kyseinen rivi tietokannasta:

$sth = $dbh->query("SELECT COUNT(*) AS count FROM lainausmerkeistä");
if ($rivi = $sth->fetchRow()) (
$count = $rivi;
) muu (
kuolla ($row->getMessage());
}
$satunnainen = mt_rand(0, $count - 1);
$sth = $dbh->query("VALITSE lainaus lainausmerkeistä LIMIT $satunnainen,1");
while ($rivi = $sth->fetchRow()) (
tulosta $rivi .

"\n";
}

Tämä koodinpätkä määrittää taulukon rivien kokonaismäärän, luo satunnaisluvun kyseiseltä alueelta ja käyttää sitten parametria LIMIT $random,1 valitakseen yhden rivin taulukosta, joka alkaa paikasta $random. IN MySQL-versiot 3.23 tai uudempi, vaihtoehtoinen vaihtoehto on mahdollinen:

$sth = $dbh->query("VALITSE lainaus lainausmerkeistä ORDER BY RAND() LIMIT 1");
while ($rivi = $sth->fetchRow()) (
tulosta $rivi . "\n";
}

Tässä tapauksessa MySQL sijoittaa rivit ensin satunnainen järjestys ja palauttaa sitten ensimmäisen rivin.

Teknisesti termi "satunnaislukugeneraattori" on hölynpölyä, koska luvut itsessään eivät ole satunnaisia. Onko esimerkiksi 100 satunnainen luku? Entä 25? Tämä termi itse asiassa tarkoittaa, että se luo numerosarjan, joka ilmestyy satunnaisesti. Tämä herättää vaikeamman kysymyksen: mikä on satunnaislukujen sarja? Ainoa oikea vastaus: satunnaislukujono on sarja, jossa kaikki elementit eivät liity toisiinsa. Tämä määritelmä johtaa paradoksiin, että mikä tahansa sekvenssi voi olla joko satunnainen tai ei-satunnainen riippuen siitä, kuinka sekvenssi saadaan. Esimerkiksi, seuraava rivi numeroita
1 2 3 4 5 6 7 8 9 0
vastaanotettiin painettuna ylälinja näppäimistöt järjestyksessä, joten sarjaa ei voida pitää satunnaisesti generoituna. Mutta entä jos saat saman sarjan, kun otat numeroidut tennispallot ulos piippusta. IN tässä tapauksessa tämä on jo satunnaisesti luotu sekvenssi. Tämä esimerkki osoittaa, että sekvenssin satunnaisuus riippuu siitä, miten se on saatu, eikä itse sekvenssistä.

Muista, että tietokoneella luotu numerosarja on deterministinen: jokainen luku ensimmäistä lukuun ottamatta riippuu sitä edeltävistä luvuista. Teknisesti tämä tarkoittaa sitä, että tietokone voi tuottaa vain näennäisen satunnaisen numerosarjan, ts. itse asiassa ne eivät ole todella satunnaisia. Tämä kuitenkin riittää useimpiin tehtäviin ja yksinkertaisuuden vuoksi tällaisia ​​sekvenssejä kutsutaan satunnaisiksi. John von Neumann kehitti yhden erittäin mielenkiintoisen menetelmän; sitä kutsutaan usein neliökeskiarvoksi. Tässä menetelmässä edellinen satunnaisluku neliöidään ja keskimmäiset numerot erotetaan tuloksesta. Jos esimerkiksi luot kolminumeroisia lukuja ja edellinen luku oli 121, tuloksen neliöiminen antaa tulokseksi 14641. Keskimmäisten kolmen numeron neliöiminen antaa seuraavan satunnaisluvun 464. Tämän menetelmän haittana on, että siinä on hyvin lyhyt toistojakso, jota kutsutaan sykliksi. Tästä syystä tätä menetelmää ei käytetty tänään. Nykyaikaiset menetelmät Satunnaislukujen luominen on paljon vaikeampaa.

Satunnaiset luvut PHP:ssä

PHP:ssä on kaksi funktioryhmää satunnaislukujen käsittelyä varten. Puhtaasti ulkoisesti ne voidaan erottaa mt_-etuliitteellä yhden ryhmän kaikkien toimintojen osalta.

Vanhentuneet ominaisuudet
funktion rand. Palauttaa kokonaisluvun nollan ja arvon RAND_MAX (joka on 32767) välillä. Voi sisältää kaksi valinnaista kokonaislukuparametria - jos ne on määritetty, ensimmäisestä parametrista toiseen luodaan satunnaisluku.

Echo rand(); kaikurand(1 100); // Anna satunnaisluku väliltä 1-100

Toiminto srand. Määrittää rand-funktion tuottamien satunnaislukujen sarjan. Siinä on koko parametri - milloin erilaisia ​​merkityksiä Tällä parametrilla rand tuottaa erilaisia ​​numerosarjoja. Srand-funktiota tarvitsee kutsua vain kerran ennen kaikkia rand-funktion kutsuja. Käyttöesimerkki:

Srand(1288); // Alusta satunnaislukugeneraattori kohteelle ($i=0; $i= 3.0.6, PHP 4, PHP 5)

Kuvaus:

Int mt_getrandmax (tyhjä)

Esitykset enimmäisarvo, jonka mt_rand()-funktio voi palauttaa

mt_rand()

Luo parhaan satunnaisarvon (PHP 3 >= 3.0.6, PHP 4, PHP 5)

Kuvaus:

int mt_rand()

Monilla satunnaislukugeneraattoreiden vanhemmilla versioilla on kyseenalaisia ​​ominaisuuksia ja ne ovat hitaita. Oletuksena PHP käyttää rand()-funktiota satunnaislukujen luomiseen. Funktio mt_rand() on hyvä vaihtoehto. Se käyttää satunnaislukugeneraattoria, joka on 4 kertaa nopeampi kuin rand() ja käyttää Mersenne Twisteriä.

Ilman valinnaisia ​​min- ja max-argumentteja kutsuttu mt_rand() palauttaa näennäissatunnaisen arvon, joka vaihtelee välillä 0 ja RAND_MAX. Jos haluat saada esimerkiksi satunnaisia ​​arvoja väliltä 5-15, etsi mt_rand (5, 15).

Esimerkki mt_rand()

Toteutuksen tulos tämä esimerkki tulee jotain tällaista:

1604716014
1478613278
6

Kommentti

Huomautus: Versiossa 3.0.7 aiemmissa versioissa funktion toinen parametri määritti numeroalueen. Esimerkiksi saadaksesi satunnaislukuja väliltä 5 ja 15 näissä versioissa sinun on määritettävä mt_rand(5, 11)-funktio.

mt_srand()

Asettaa alkuarvon paras generaattori satunnaisluvut (PHP 3 >= 3.0.6, PHP 4, PHP 5)

Kuvaus:

Void mt_srand()

Asettaa satunnaislukugeneraattorin alkuarvon siemenellä. PHP 4.2.0:sta lähtien siemen on valinnainen ja oletusasetus satunnaisia ​​arvoja mene alas.

Esimerkki mt_srand()

Huomautus: PHP 4.2.0:sta lähtien satunnaislukugeneraattoria ei enää tarvitse alustaa komennoilla srand() tai mt_srand(), koska tämä tapahtuu nyt automaattisesti.