DevProTalk

DevProTalk (http://www.devprotalk.com/index.php)
-   PHP (http://www.devprotalk.com/forumdisplay.php?f=9)
-   -   rand i mt_rand pitanje.. (http://www.devprotalk.com/showthread.php?t=594)

bokacbl 03. 02. 2006. 15:45

rand i mt_rand pitanje..
 
pitanje u vezi razlike ove dvije php funkcije:

rand i mt_rand..

naime procitao sam na php.net-u o obema funkcijama i vidio sam da je sintaksa ista a da mt_rand bolje generise random vrijednosti

e sad me interesuje s obzirom da sam radio neku skriptu koja dosta koristi rand funkciju, da li mogu nastati neki problemi ako promjenim
rand u mt_rand u kompletnoj skripti??

Hvala

bluesman 03. 02. 2006. 15:54

Ne, neces imati problema, osim sto sam ja ukapirao da je PHP random funkcija jako losa. Pogledaj temu o generisanju 2 miliona unique kodova. Vec posle 1000 random stringova od 8 karaktera pocinje da duplira a neki kodovi su se vec posle 5000 generisanih kodova pojavili i po 10 puta.

Ne znam koliko ti je bitno to, ako nije previse onda mozes slobodno sa mt_rand().

bokacbl 03. 02. 2006. 15:58

Citat:

Originalno napisao bluesman
Ne, neces imati problema, osim sto sam ja ukapirao da je PHP random funkcija jako losa. Pogledaj temu o generisanju 2 miliona unique kodova. Vec posle 1000 random stringova od 8 karaktera pocinje da duplira a neki kodovi su se vec posle 5000 generisanih kodova pojavili i po 10 puta.

Ne znam koliko ti je bitno to, ako nije previse onda mozes slobodno sa mt_rand().

Ma znam ja sam to primjetio na jednostavnom primjeru da izabere random vrijednost izmedju 1-20.. i on je u 15 random vrijednosti imao po 2 duple..
veoma lose pogotovo ukoliko je random veoma bitan u okviru skripte..

ok hvala na odgovoru onda cu samo u svojim funkcijama da zamjenim rand sa mt_rand..

Petar Marić 03. 02. 2006. 22:11

Bojane, neke razlike između rand() i mt_rand() sam dao u ovom unosu.

[edit]Izmenio sam link pošto nije pokazivao na pravi post. bluesman[/edit]

ivanhoe 04. 02. 2006. 02:54

Citat:

Originalno napisao bokacbl
Ma znam ja sam to primjetio na jednostavnom primjeru da izabere random vrijednost izmedju 1-20.. i on je u 15 random vrijednosti imao po 2 duple..
veoma lose pogotovo ukoliko je random veoma bitan u okviru skripte..

U principu ovo sto pominjes nije uopste pokazatelj kvaliteta generatora, sasvim je prihvatiljivo da na tako malom uzorku dobijes takve rezultate..zato se i zovu slucajni brojevi sto ne znas da li su neki duplirani ili su svih 15 vrednosti isti broj :)

ono u cemu se ogleda los kvalitet php generatora (i vecine drugih ugradjenih u kompajlere) je sto vrednosti krecu da konvergiraju ka nekoj vrednosti relativno brzo (ali relativno brzo znaci nesto tipa par hiljada iteracija), odnosno nemaju vise svi brojevi istu verovatnocu (iliti uniformnu raspodelu) nego se vrednosti bliske jednom broju pojavljuju cesce...

Ako kreiras kratke sekvence brojeva (tipa 15 ili 100), onda te taj problem ne brine, onda je glavna frka sto random seed nije dovoljno random (nisam 100% siguran, ali cini mi se da php koristi microtime za to, znaci broj izmedju 0 i milion). U tom slucaju, ako si na unixu mozes da probas da kao seed koristis /dev/urandom da pokupis slucajnu vrednost iz sireg opsega...

Petar Marić 04. 02. 2006. 03:40

Pa zavisi, mt_rand koristi algoritam koji baš i neće da počne da konvergira brzo ;)
Citat:

Originalno napisao Petar Marić
Ako želiš ekstremno dug period probaj Mersenne Twister algoritam, baš smo ga spominjali iz numerike na predavanjima - poznat je po tome što ima monstruozan period od 2^19937-1 u svojoj osnovnoj verziji.

Off Topic: Da, znam da sam počeo samog sebe da citiram. Ima li ko problema u vezi toga? :p


A pošto mi je u virtuelnoj mašini dignut MATLAB, odlučih da proverim koliko je Mersenne Twister algoritam u stvari jak:
Kôd:

>> broj_jedinstvenih = length(  unique( randint(1, 2e6, 2^32) )  )
broj_jedinstvenih =
    1999511

>> broj_duplih = 2e6 - broj_jedinstvenih
broj_duplih =
  489

>> broj_duplih_procenti = broj_duplih / 2e6 * 100
broj_duplih_procenti =
    0.0245

>>

Mislim da 0.0245% dupliranih slučajnih brojeva i nije tako loše

zextra 04. 02. 2006. 09:51

Isti procenat koji smo dobili nakon testova u perlu ako se ne varam... :) 0.024-0.025..

Petar Marić 04. 02. 2006. 11:18

Šta da kažem - MT algoritam je zakon za ovakve stvari :D

Ipak je pametno što imamo numeriku na računarstvu, ma šta god neke kolege pričale ;)

zextra 04. 02. 2006. 11:56

Off Topic: Za sve moze da se nadje primena, samo zavisi od interesovanja da li ces nesto uciti ili neces...

ivanhoe 04. 02. 2006. 17:06

Citat:

Originalno napisao Petar Marić
Pa zavisi, mt_rand koristi algoritam koji baš i neće da počne da konvergira brzo ;)


nece, mt_rand je ok, jer on koristi Mersenne Twister...i ne samo to nego je i dosta brzi od obicnog rand-a......ono sto sam ja pricao se odnosi na standardne rand generatore koji se oslanjaju na libc funkcije za to (a dobar deo kompajlera to koristi po defaultu...), oni nisu dobri za kreiranje duzih sekvenci rnd brojeva...


Vreme je GMT +2. Trenutno vreme je 20:38.

Powered by vBulletin® Verzija 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Copyright © DevProTalk. All Rights Reserved.

Mišljenja, saveti, izjave, ponude ili druge informacije ili sadržaji nastali na Sajtu su vlasništvo onoga ko ih je kreirao, a ne DevProTalk.com, tako da ne morate da se oslanjate na njih.
Autori poruka su jedini odgovorni za ovakve sadržaje. DevProTalk.com ne garantuje tačnost, kompletnost ili upotrebnu vrednost informacija, stavova, saveta ili datih izjava. Ne postoje uslovi pod kojima bi mi bili odgovorni za štetu ili gubitak koji je posledica bilo čijeg oslanjanja na nepouzdane informacije, ili bilo kakve informacije nastale kroz komunikaciju između registrovanih članova.
Web sajt može sadržavati linkove na druge web sajtove na Internetu ili neke druge sadržaje. Ne kontrolišemo niti podržavamo te druge web sajtove, niti smo pregledali bilo kakve sadržaje na takvim sajtovima. Mi nećemo biti odgovorni za legalnost, tačnost ili prikladnost bilo kog sadržaja, oglasa, proizvoda, usluga ili informacije lociranim na ili distribuiranih kroz druge web sajtove, niti za bilo kakvu štetu nastalu kao posledica takvih informacija. DevProTalk.com drži i čuva druga prava vlasništva na web sajtu. Web sajt sadrže materijale zaštićene copyright-om, zaštitne znakove i druge informacije o pravu vlasništva ili softver. Članovi mogu poslatu informacije zaštićene pravima vlasništva njihovih nosilaca i ona ostaju zaštićena bez obzira da li su oni koji prenose te informacije to naveli ili ne. Osim informacija koje su u javnom vlasništvu ili za koje dobijete dozvolu, nemate pravo da kopirate, modifikujete ili na bilo koji način menjate, objavljujete, prenosite, distribuirate, izvršavate, prikazujete ili prodajte bilo koju informaciju zaštićenu pravima vlasništva. Slanjem informacija ili sadržaja na bilo koji deo DevProTalk.com, Vi automatski dozvoljavate i predstavljate garanciju da imate pravo da dozvolite DevProTalk.com ili članovima DevProTalk.com bespovratnu, kontinualnu, neograničenu, globalnu dozvolu da koriste, kopiraju, izvršavaju, prikazuju i distribuiraju takve informacije i sadržaje i da iz takvih sadžaja koriste bilo koji deo u bilo koje svrhe, kao i pravo i dozvolu da koriste gore navedene sadržaje. Svi zaštitni znakovi (trademarks), logotipi, oznake usluga, firme ili imena proizvoda koji se pominju na ovom web sajtu su vlasništvo kojim raspolažu njihovi vlasnici.