Php ndio jenereta bora zaidi ya nambari bila mpangilio. Uchaguzi nasibu kutoka kwa safu katika PHP. Nambari za nasibu katika PHP

Huanzisha jenereta ya nambari nasibu. Sintaksia:

Mbegu tupu (int seed)

Huanzisha jenereta ya nambari nasibu yenye thamani ya mbegu.

Srand((mara mbili) microtime()*1000000);
$ random = rand();
echo $ random;

GTRANDMAX

Hurejesha nambari kubwa zaidi ya nasibu. Sintaksia:

Int getrandmax()

Chaguo hili la kukokotoa hurejesha thamani ya juu zaidi inayoweza kupatikana kwa kutumia chaguo la kukokotoa la kuunda nambari nasibu la rand().

Kawaida ni 32767

Huzalisha nambari nasibu. Sintaksia:

Int rand()

Inapoitwa na vigezo vya hiari vya min na upeo, chaguo hili la kukokotoa hutoa nambari nasibu hadi na kujumuisha vigezo hivyo. Ikiwa vigezo vya chini na vya juu havipo, nambari ya kuanzia 0 hadi RAND_MAX itarejeshwa.

Ili kazi hii ifanye kazi kwa usahihi, kabla ya kuitumia, unahitaji kuanzisha jenereta ya nambari isiyo ya kawaida na srand() kazi.

lcg_thamani()

Jenereta ya nambari bandia za LCG (PHP 4, PHP 5)

Maelezo:

Float lcg_value (batili)

lcg_value() hurejesha nambari ya uwongo katika safu (0, 1). Chaguo hili la kukokotoa linachanganya jenereta mbili na 2^31 - 85 na 2^31 - 249 katika kipindi.

mt_getrandmax()

Inaonyesha thamani kubwa zaidi iwezekanayo nasibu (PHP 3 >= 3.0.6, PHP 4, PHP 5)

Maelezo:

Int mt_getrandmax (batili)

Inaonyesha thamani ya juu zaidi inayoweza kurejeshwa na mt_rand()

mt_rand()

Huzalisha thamani bora zaidi ya nasibu (PHP 3 >= 3.0.6, PHP 4, PHP 5)

Maelezo:

int mt_rand()

Matoleo mengi ya zamani ya jenereta za nambari nasibu yana sifa zinazotiliwa shaka na ni ya polepole. Kwa chaguo-msingi, PHP hutumia kazi ya rand() kutoa nambari nasibu. mt_rand() kazi ni mbadala mzuri. Inatumia jenereta ya nambari nasibu ambayo ni haraka mara 4 kuliko rand() na hutumia Mersenne Twister.

Imepigiwa simu bila hoja za hiari na upeo wa juu, mt_rand() hurejesha thamani isiyo ya kawaida ya uwongo kati ya 0 na RAND_MAX. Ikiwa unahitaji kupata, kwa mfano, maadili ya nasibu kati ya 5 na 15 pamoja, tafuta mt_rand (5, 15).

Mfano wa kutumia mt_rand()

Matokeo ya kuendesha mfano huu itakuwa kitu kama hiki:

1604716014
1478613278
6

Maoni

Kumbuka: Katika matoleo kabla ya 3.0.7, parameta ya pili ya kazi ilibainisha anuwai ya nambari. Kwa mfano, ili kupata nambari nasibu kati ya 5 na 15 katika matoleo haya unahitaji kubainisha kitendakazi cha mt_rand(5, 11).

mt_srand()

Huweka thamani ya awali ya jenereta bora zaidi ya nambari nasibu (PHP 3 >= 3.0.6, PHP 4, PHP 5)

Maelezo:

Utupu mt_srand()

Huweka thamani ya awali ya jenereta ya nambari nasibu kwa kutumia mbegu. Kufikia PHP 4.2.0, mbegu ni ya hiari na mipangilio chaguo-msingi ya thamani nasibu imeachwa.

Mfano wa kutumia mt_srand()

Kumbuka: Kuanzia PHP 4.2.0, si lazima tena kuanzisha jenereta ya nambari nasibu na srand() au mt_srand(), kwani hii sasa inafanywa kiotomatiki.

Kitaalam, neno "jenereta ya nambari nasibu" ni upuuzi, kwani nambari zenyewe sio za nasibu. Kwa mfano, 100 ni nambari ya nasibu? Vipi kuhusu 25? Neno hili linamaanisha nini ni kwamba huunda mlolongo wa nambari zinazoonekana nasibu. Hii inazua swali gumu zaidi: mlolongo wa nambari nasibu ni nini? Jibu sahihi pekee: mlolongo wa nambari nasibu ni mlolongo ambao vipengele vyote havihusiani. Ufafanuzi huu husababisha kitendawili kwamba mfuatano wowote unaweza kuwa wa nasibu au usio wa nasibu, kulingana na jinsi mfuatano unapatikana. Kwa mfano, safu zifuatazo za nambari
1 2 3 4 5 6 7 8 9 0
ilipatikana kwa kuandika mstari wa juu wa kibodi kwa mpangilio, kwa hivyo mlolongo hauwezi kuzingatiwa kuwa umetolewa kwa nasibu. Lakini vipi ikiwa utapata mlolongo sawa wakati unachukua mipira ya tenisi iliyohesabiwa kutoka kwenye pipa. Katika kesi hii, tayari ni mlolongo unaozalishwa kwa nasibu. Mfano huu unaonyesha kuwa unasibu wa mfuatano unategemea jinsi ulivyopatikana, na si kwa mfuatano wenyewe.

Kumbuka kwamba mlolongo wa nambari zinazozalishwa na kompyuta ni wa kuamua: kila nambari isipokuwa ya kwanza inategemea nambari zilizo kabla yake. Kitaalam, hii ina maana kwamba tu mlolongo wa quasi-random wa nambari unaweza kuzalishwa na kompyuta, i.e. kwa kweli wao si kweli random. Walakini, hii inatosha kwa kazi nyingi na kwa unyenyekevu mlolongo kama huo utaitwa nasibu. Njia moja ya kuvutia sana ilitengenezwa na John von Neumann; mara nyingi huitwa mzizi maana ya mraba. Kwa njia hii, nambari ya nasibu iliyotangulia ni mraba, na kisha nambari za kati hutolewa kutoka kwa matokeo. Kwa mfano, ikiwa unaunda nambari zilizo na nambari tatu, na nambari iliyotangulia ilikuwa 121, kisha kuigawanya inatoa matokeo 14641. Kutenganisha nambari tatu za kati kunatoa nambari inayofuata ya nasibu 464. Ubaya wa njia hii ni kwamba ina sana. muda mfupi wa kurudia, unaoitwa mzunguko. Kwa sababu hii, njia hii haitumiki leo. Njia za kisasa za kutengeneza nambari za nasibu ni ngumu zaidi.

Nambari za nasibu katika PHP

PHP ina vikundi viwili vya kazi za kufanya kazi na nambari za nasibu. Kwa nje, zinaweza kutofautishwa na kiambishi awali cha mt_ kwa utendakazi wote wa mojawapo ya vikundi.

Vipengele vilivyoacha kutumika
kazi ya rand Hurejesha nambari kamili kati ya sifuri na thamani ya RAND_MAX (ambayo ni 32767). Inaweza kuwa na vigezo viwili vya hiari kamili - ikiwa vimebainishwa, nambari nasibu inatolewa kutoka kwa kigezo cha kwanza hadi cha pili.

Echo rand(); echo rand(1,100); // Toa nambari nasibu kutoka 1 hadi 100

Kazi ya srand. Hubainisha mfuatano wa nambari nasibu zinazozalishwa na chaguo za kukokotoa za rand. Inayo parameta nzima - kwa maadili tofauti ya paramu hii, rand itatoa mlolongo tofauti wa nambari. Kitendaji cha srand kinahitaji tu kuitwa mara moja kabla ya simu zote kwa kazi ya rand. Mfano wa matumizi:

Srand(1288); // Anzisha jenereta ya nambari nasibu ya($i=0; $i